2017-02-11 126 views
1

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表來了!

謝謝!

艾登

+2

嘗試一個調試器。另外'返回Integer.valueOf(優先級爲1).compareTo(優先級2);' –

+0

我@ElliottFrisch同意。你也可以將這一行改成這個'return(priority1> priority2?1:-1);'而不是0再次返回-1。 – Vucko

+0

但它爲什麼這樣做?請閱讀問題底部的UPDATED。是由於1.7版本嗎? – Aiden

回答

4

問題是你的比較器壞了。當你有一個比較器

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)); 
+0

謝謝,那麼它意味着當priority1小於priority2時,我必須使用-1而不是0? – Aiden

+1

謝謝冠軍!將其標記爲已回答 – Aiden

+0

@Aiden事實上,我已經更新了我的答案。我建議你有一個單元測試,檢查我上面提到的情況。 –