Collections.sort不适用于java 1.7
Java6使用合并排序来比较Collections.sort中的两个对象,而Java1.7使用Timsort 我有这个类来对对象进行排序Collections.sort不适用于java 1.7,java,sorting,collections,comparator,Java,Sorting,Collections,Comparator,Java6使用合并排序来比较Collections.sort中的两个对象,而Java1.7使用Timsort 我有这个类来对对象进行排序 Class ObjectSort { String Name = ""; int priority = 0; public ObjectSort (String name, int priority) { this.Name = Name; this.priority = priority;
Class ObjectSort
{
String Name = "";
int priority = 0;
public ObjectSort (String name, int priority)
{
this.Name = Name;
this.priority = priority;
}
public getPriority()
{
return priority;
}
}
我的测试班是
TestClass
{
...main()
{
List<ObjectSort> sorted = new ArrayList<ObjectSort> ();
sorted.add ("Table", 99);
sorted.add ("Chair", 1);
Collections.sort(sorted, new Comparator ());
}
// inner class to define comparator logic
private static final class Comparator implements java.util.Comparator<ObjectSort>
{
@Override
public int compare (ObjectSort f1, ObjectSort f2)
{
try
{
// Get the allocation priorities
int priority1 = f1.getPriority ();
int priority2 = f2.getPriority ();
if (priority1 == priority2)
return 0;
else
return (priority1 > priority2 ? 1 : 0);
}
catch (Exception e)
{
// Shouldn't happen, because we have the objects OK and there's no database activity
// happening here.
assert true;
}
return 0;
}
}
}
现在,当我们在Java1.6中运行代码时,它正确地对它进行排序,椅子放在表的前面,也就是说,它在排序,它是升序,这是我想要的
但当代码在Java1.7中运行时,它根本不会对其进行排序,而是将表放在椅子前面。我检查了,1.6使用合并排序,而1.7使用Timsort。请帮我说出我的代码中有什么错误
更新
在变量f1的1.7中,Chair在代码执行期间出现,而在1.6中Table出现
谢谢
艾登:问题是你的比较器坏了。当你有一个比较器
comparator.compare(a, b) == -comparator.compare(b, a)
Java7不接受这一点的原因是;Java7有更多的检查来证明这个条件是真的
他们已经将java更新为1.7:并且该代码现在在那里不起作用:
它从未工作过,以前可能没有正确排序,但您以前没有遇到运行时错误
一个简短的版本将工作是;不要重用公共内置类的名称
static class ObjectSortComparator implements Comparator<ObjectSort> {
@Override
public int compare (ObjectSort f1, ObjectSort f2) {
// Get the allocation priorities
int priority1 = f1.getPriority ();
int priority2 = f2.getPriority ();
return priority1 == priority2 ? 0 : (priority1 > priority2 ? 1 : -1);
}
}
问题是你的比较器坏了。当你有一个比较器
comparator.compare(a, b) == -comparator.compare(b, a)
Java7不接受这一点的原因是;Java7有更多的检查来证明这个条件是真的
他们已经将java更新为1.7:并且该代码现在在那里不起作用:
它从未工作过,以前可能没有正确排序,但您以前没有遇到运行时错误
一个简短的版本将工作是;不要重用公共内置类的名称
static class ObjectSortComparator implements Comparator<ObjectSort> {
@Override
public int compare (ObjectSort f1, ObjectSort f2) {
// Get the allocation priorities
int priority1 = f1.getPriority ();
int priority2 = f2.getPriority ();
return priority1 == priority2 ? 0 : (priority1 > priority2 ? 1 : -1);
}
}
尝试调试器。另外,返回Integer.valueOfpriority1.compareTopriority2;我同意埃利奥特弗里希的观点。您还可以将此行更改为返回优先级1>优先级2?1 : -1; 再次返回-1而不是0。但它为什么这样做呢?请阅读问题底部的更新内容。这是由于1.7版本吗?请使用调试器逐步了解原因。但基本上是的,合并排序和timsort是不同的算法,它们的行为也不同。快速排序、计数排序和选择排序也是如此。为什么你会对它们不完全相同感到惊讶?而且,Java1.7已经快两年了为什么要询问此行为?@Aiden您的比较器不遵循约定,它有时会返回1进行比较,但会返回0进行反向比较。请尝试调试器。另外,返回Integer.valueOfpriority1.compareTopriority2;我同意埃利奥特弗里希的观点。您还可以将此行更改为返回优先级1>优先级2?1 : -1; 再次返回-1而不是0。但它为什么这样做呢?请阅读问题底部的更新内容。这是由于1.7版本吗?请使用调试器逐步了解原因。但基本上是的,合并排序和timsort是不同的算法,它们的行为也不同。快速排序、计数排序和选择排序也是如此。为什么你会对它们不完全相同感到惊讶?而且,Java1.7已经快两年了你为什么要问这种行为?@Aiden你的比较器不遵循约定,它有时会返回1进行比较,但它会返回0进行反向比较。谢谢,这意味着当优先级1小于优先级2时,我必须使用-1而不是0?@Aiden确实,我已经更新了我的答案。我建议您使用一个单元测试来检查我上面提到的条件。@Aiden注意:您不需要捕获异常并忽略它。最好让它抛出最初的异常,虽然这不应该发生在其他情况下,但这意味着当优先级1小于优先级2时,我必须使用-1而不是0?@Aiden确实,我已经更新了我的答案。我建议您使用一个单元测试来检查我上面提到的条件。@Aiden注意:您不需要捕获异常并忽略它。最好让它抛出原始异常,尽管这也不应该发生