2014-01-09 48 views
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; 
  1. 我試圖重寫equals()方法,用相同的邏輯比較,想,如果equals和比較返回相同的結果,應該解決的問題;但它沒有按預期工作。

  2. 當我將比較方法拆分爲兩個單獨的比較器(如下所示)時,排序(使用兩個比較器)不會引發任何異常。可能的原因是什麼?

下面的代碼:

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; 
    }; 
} 
+2

是有可能,'o1.dependsOn(O2)'和'O2 .dependsOn(o1)'都是真的嗎? – Henry

+1

除非我們看到'dependsOn'和'isLookup'方法在這裏做什麼,否則很難評論。 –

+0

不能說你的具體例子,但要確保你的比較功能尊重嚴格弱排序的概念。也就是說,如果a a並且像這樣。 –

回答

0

你不缺 「.entityClass」,如:

if (o1.isLookup() && !o2.isLookup()) { 
    return -1; 
} 
if (!o1.isLookup() && o2.isLookup()) { 
    return 1; 
} 

if (o1.dependsOn(o2.entityClass)) { 
    return 1; 
} 
if (o2.dependsOn(o1.entityClass)) { 
    return -1; 
} 
return 0; 
相關問題