2012-12-07 73 views
0

我的排序方法出現錯誤。比較方法違反了其在排序方法中的一般合同

比較法違反其總承包

這是我用的排序方法排序對象

public abstract class ComparablePerson extends IDValueItem implements 
     Comparable<ComparablePerson> { 

    private int score; 
    private String itemID,itemName; 

    //setters and getters 

    public int compareTo(ComparablePerson another) { 
    if (score == another.getScore()) 
     return this.getItemName().compareToIgnoreCase(another.getItemName()); 
    else if ((score) > another.getScore()) 
     return 1; 
    else 
     return -1; 
} 

@Override 
public boolean equals(Object o) { 
    final ComparablePerson other = (ComparablePerson) o; 

    if (score == other.getScore() && this.getItemName().equalsIgnoreCase(other.getItemName())) 
     return true; 
    else 
     return false; 
} 

我只是叫 Collections.sort(ComparablePersonCollection);

這可能是什麼原因?

回答

2

compareToequals方法實現似乎是不一致的,錯誤是告訴你,對於相同的兩個對象equalscompareTo不會產生零,這是不正確給人真實的。我建議您從equals調用compareTo以確保一致性或以其他方式定義自定義Comparator<T>

簡單地做:

public abstract class ComparablePerson extends IDValueItem implements Comparable<ComparablePerson> { 

    private int score; 
    private String itemID,itemName; 

    //setters and getters 

    public int compareTo(ComparablePerson another) { 
    if (score == another.getScore()) 
     return this.getItemName().compareToIgnoreCase(another.getItemName()); 
    else if ((score) > another.getScore()) 
     return 1; 
    else 
     return -1; 
    } 

    @Override 
    public boolean equals(Object o) { 
     return compareTo(o) == 0; 
    } 
} 
+0

這固定它,THX) –

1

ComparablePerson是抽象的,比較方法可能過載了別處......

你能後的客戶端(該公司擁有的集合)和具體的類?

此代碼工作良好:

public class ComparablePerson implements Comparable<ComparablePerson> { 
    public ComparablePerson(int score, String name) { 
     _score = score; 
     _itemName = name; 
    } 

    @Override public int compareTo(ComparablePerson another) { 
     int delta = _score - another._score; 
     if(delta != 0) return delta; 
     return _itemName.compareToIgnoreCase(another._itemName); 
    } 

    @Override public boolean equals(Object o) { 
     return 0 == compareTo((ComparablePerson)o); 
    } 

    @Override public int hashCode() { 
     return super.hashCode(); 
    } 

    private final int _score; 
    private final String _itemName; 

    public static void main(String[] args) { 
     List<ComparablePerson> oSet = new LinkedList<>(); 
     oSet.add(new ComparablePerson(5, "x")); 
     oSet.add(new ComparablePerson(5, "y")); 
     oSet.add(new ComparablePerson(5, "z")); 
     oSet.add(new ComparablePerson(6, "x")); 
     oSet.add(new ComparablePerson(6, "y")); 
     oSet.add(new ComparablePerson(6, "z")); 
     Collections.sort(oSet); 
     System.err.println("Ok"); 
    } 
} 
相關問題