3
我正在將我們的項目升級到java 7.我遇到了Collections.sort()的Illegal Argument異常。我知道異常的原因是java 7中的新Timsort(儘管之前在這個問題上提出過所有問題,但我確實拋棄了)。現在我需要修改比較邏輯來克服這個異常。這裏是我的比較方法Java 7:java.lang.IllegalArgumentException:比較方法違反了它的一般合同
if (o1.isLookup() && !o2.isLookup()) {
return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
return 1;
}
if (o1.dependsOn(o2)) {
return 1;
}
if (o2.dependsOn(o1)) {
return -1;
}
return 0;
我試圖重寫equals()方法,用相同的邏輯比較,想,如果equals和比較返回相同的結果,應該解決的問題;但它沒有按預期工作。
當我將比較方法拆分爲兩個單獨的比較器(如下所示)時,排序(使用兩個比較器)不會引發任何異常。可能的原因是什麼?
下面的代碼:
protected Comparator<EntityWrapper> getComparator2() {
return new Comparator<EntityWrapper>() {
public int compare(EntityWrapper o1, EntityWrapper o2) {
if (o1.dependsOn(o2.entityClass)) {
// This depends on otherWrapper
return 1;
}
if (o2.dependsOn(o1.entityClass)) {
// OtherWrapper depends on this
return -1;
}
return 0;
}
};
}
protected Comparator<EntityWrapper> getComparator1() {
return new Comparator<EntityWrapper>() {
public int compare(EntityWrapper o1, EntityWrapper o2) {
if (o1.isLookup() && !o2.isLookup()) {
return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
return 1;
}
return 0;
};
}
是有可能,'o1.dependsOn(O2)'和'O2 .dependsOn(o1)'都是真的嗎? – Henry
除非我們看到'dependsOn'和'isLookup'方法在這裏做什麼,否則很難評論。 –
不能說你的具體例子,但要確保你的比較功能尊重嚴格弱排序的概念。也就是說,如果a a並且像這樣。 –