Collections.sort不工作的Java 1.7
问题描述:
Java 6的使用合并排序两个对象在Collections.sort()而Java 1.7使用TimsortCollections.sort不工作的Java 1.7
我有这个类对象进行排序
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上运行的代码,它正确地排序它,主席来之前表是它的排序是升序排列,这是我想要的。
但其中的代码是用Java 1.7运行时,它不会它在所有排序,表自带椅子前。我检查和1.6使用合并排序,而1.7使用Timsort。请帮我告诉我的代码中有什么问题?
UPDATE 在变量f1 1.7,主席代码执行过程中来,而在1.6表来了!
谢谢!
艾登
答
问题是你的比较器坏了。当你有一个比较器
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,你不需要令状e你自己,你可以做
sorted.sort(Comparator.comparingInt(ObjectSort::getPriority));
尝试一个调试器。另外'返回Integer.valueOf(优先级为1).compareTo(优先级2);' –
我@ElliottFrisch同意。你也可以将这一行改成这个'return(priority1> priority2?1:-1);'而不是0再次返回-1。 – Vucko
但它为什么这样做?请阅读问题底部的UPDATED。是由于1.7版本吗? – Aiden