Java 6使用合并排序来比较Collections.sort()中的两个对象,而Java 1.7使用Timsort
我有这个类来对象进行排序
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;
}
}
}
现在当我们在java 1.6中运行代码时,它正确地对它进行排序,主席来到BEFORE表,它正在排序它是ASCENDING顺序,我想要它。
但是,如果代码在Java 1.7中运行,它根本不对它进行排序,Table在Chair之前出现。我检查过,1.6使用合并排序,而1.7使用Timsort。请帮我告诉我的代码有什么问题?
UPDATE 在1.7中的变量f1中,Chair在代码执行期间出现,而在1.6表中来了!
谢谢!
艾登
答案 0 :(得分:5)
问题是您的比较器坏了。当你有一个比较器
comparator.compare(a, b) == -comparator.compare(b, a)
Java 7不接受这个的原因是; Java 7有更多检查,表明这种情况属实。
他们已将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);
}
}
注意:在Java 8中,您不需要自己编写,您可以
sorted.sort(Comparator.comparingInt(ObjectSort::getPriority));