2017-05-11 152 views
-2

我有這樣的代碼,比較值排序:集合排序

public static Comparator<Partikel> getFFsorted() { 
    Comparator comp = new Comparator<Partikel>() { 
     @Override 
     public int compare(Partikel s1, Partikel s2) { 
      if(s1.ff>s2.ff) 
      { 
       return 1; 
      } 
      else 
      { 
       return -1; 
      } 
     } 
    }; 
    return comp; 
} 

,但我有一個這樣的錯誤:在線程「主」 java.lang.IllegalArgumentException異常

例外: 比較方法違反其總合同!在 java.util.TimSort.mergeHi(TimSort.java:868)

在java.util.TimSort.mergeAt(TimSort.java:485)

在java.util.TimSort.mergeCollapse(TimSort。的java:410)

在java.util.TimSort.sort(TimSort.java:214)

在java.util.TimSort.sort(TimSort.java:173)

在java.util中.Arrays.sort(Arrays.java:659)

at java.util.Collections.sort(Collections.java:217)

如何修復它?

+1

*「比較法違反它的一般合同!「*當你[閱讀合同是什麼](http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-TT-)和將它與你的代碼相比較,沒有什麼可以跳出來嗎? –

回答

1

您的方法不處理等於ff的情況。

因此compare(s1,s2)compare(s2,s1)都會在s1.ff == s2.ff時返回-1。這違反了compare的合同,這要求sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y

public int compare(Partikel s1, Partikel s2) { 
     if(s1.ff > s2.ff) { 
      return 1; 
     } else if (s1.ff < s2.ff) { 
      return -1; 
     } else { 
      return 0; 
     } 
    } 
0

那些FF成員在Partikel類的樣子給我一些數字...

所以這將是你實現從包裝類的靜態方法越好..

類似:

@Override 
public int compare(Partikel p1.ff, Partikel p2) { 
    return Integer.compare(p1.ff, p2.ff); 
    //or 
    return Double.compare(p1.ff, p2.ff); 
    //or 
    return Long.compare(p1.ff, p2.ff); 
    //or 
    return Float.compare(p1.ff, p2.ff); 
} 
0

,如果您有任何NaN的VAL會發生這種情況在比較

例如UE的:

public class Demo 
{ 
    public static void main(String[] args) { 
     double a = Double.NaN; 
     double b = Double.NaN; 

     System.out.println(a < b); 
     System.out.println(a > b); 

}}

所有這些打印錯誤。所以你最終可能會遇到兩個非NaN值都被認爲與NaN「相等」的情況,但是一個比另一個更大。基本上,你應該弄清楚你想如何處理NaN值。還要檢查確實是這個問題,當然......你真的想爲你的Partikel使用NaN值嗎?

And also the default comparator has implementation to compare for three cases i.e 
    1.Greater than 
    2. Less than 
    3. Equal to 

因爲你正在服用的只有兩個,所以儘量分隔成三個如下:

public int compare(Partikel s1, Partikel s2) { 
    if(s1.ff>s2.ff) 
     return 1; 
    else if(s1.ff<s2.ff) 
     return -1; 
//for equality 
    else 
     return 0; 
} 
+0

沒有'Integer.NaN'這樣的東西 - 只有'Float.NaN'和'Double.NaN'。 –

0

你不處理其中的值相等的情況。

Java已經內置函數在包裝類正確地比較原始數據類型爲每個原始數據類型(整型,長整型,浮點,雙精度等),您可以使用:

Comparator comp = new Comparator<Partikel>() { 
    @Override 
    public int compare(Partikel s1, Partikel s2) { 
     return Integer.compare(s1.ff, f2.ff); 
     // Or Long.compare, Float.compare, Double.compare, etc. 
     // depending on the datatype of the field "ff". 
    } 
};