2011-12-24 158 views
-1

Stop(Id, Name)是一個java類,我想將這些停止對象存儲在java.util.Set中,並且這些對象應根據StopId排序。 這是我的比較器如何在java中實現比較器?

public class StopsComparator implements Comparator{ 

    @Override 
    public int compare(Object o1, Object o2) { 
     // TODO Auto-generated method stub 
     Stop stop1 = (Stop)o1; 
     Stop stop2 = (Stop)o2; 

     return stop1.getStopId().compareTo(stop2.getStopId()); 
    } 
} 


private Set<Stop> stops = new TreeSet<Stop>(new StopsComparator()); 

但它沒有給出正確的結果?

+10

你的意思是「它沒有給出正確的結果?」訂單是否搞亂了?它是否會拋出異常?世界結束了嗎?聖誕老人被兔子取代了嗎?請提供完整的詳細信息(輸入數據,添加元素設置,結果/調用堆棧,兔子照片和預期聖誕老人草圖。 – 2011-12-24 18:36:27

+0

它沒有給出正確的順序。如何做到這一點,我需要實現equals和hashcode方法? – 2011-12-24 18:46:35

回答

2

停止是否實現與您的比較器在同一字段上工作的equals方法?如果沒有,那麼這將導致問題。您也可能想切換到使對象實現Comparable(儘管這不會解決您所看到的問題)。

一旦你實現equals()方法,那麼你也應該實現一個hashCode()方法在同一領域工作。

Findbugs可能會告訴你這些東西。它非常有用。

0

這是從Comparator文檔:

由比較器C上的一組元件S的確定的順序對被說成是與equals一致當且僅當c.compare(E1,E2)= = 0與s1中的每個e1和e2具有相同的布爾值。

當使用能夠強制排序與equals不一致的比較器來排序排序集(或排序)時應謹慎地圖)。假設使用顯式比較器c的排序集合(或排序映射)與從集合S中繪製的元素(或鍵)一起使用。如果由S對c施加的排序與equals不一致,則排序集合(或排序映射)將表現「奇怪」。特別是,排序後的集合(或排序後的映射)將違反集合(或映射)的一般合約,這是以等價的方式定義的。

我建議嘗試實施equalshashCode

1

下面的代碼對我的作品 -

public class Stop { 

    private Long id; 
    private String name; 

    public Stop(Long id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    public Long getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public String toString() { 
     return "Stop{" + 
       "id=" + id + 
       ", name='" + name + '\'' + 
       '}'; 
    } 

    private static class StopComparator implements Comparator<Stop> { 


     public int compare(Stop o1, Stop o2) { 
      return o1.getId().compareTo(o2.getId()); 
     } 
    } 

    public static void main(String[] args) { 
     Set<Stop> set = new TreeSet<Stop>(new StopComparator()); 
     set.add(new Stop(102L, "name102")); 
     set.add(new Stop(66L, "name66")); 
     set.add(new Stop(72L, "name72")); 
     System.out.println(set); 
    } 
} 


打印 -

[停止{ID = 66,名字= 'name66'},停止{ID = 72,名= 'name72'},{停止ID = 102, 名= 'name102'}]

OFC需要實現equalshashcode使類一貫的行爲在每個Set實現,但對於TreeSet這應該是自TreeSet依賴於compareTo方法在執行addremovecontains操作(而不是像equalsHashSet)工作。

+0

TreeSet依賴compareTo方法執行put,remove或contains操作(而不是像HashSet等)。這究竟是什麼。 – 2011-12-25 06:36:24

+0

設置接口契約說它應該使用'equals'來確定等號,但是'TreeSet'沒有什麼優化,並且使用'compareTo'來確定等號而不是'equlas',所以上面的例子應該不用'equlas'和'hashcode'來實現。在停課。 – Premraj 2011-12-25 06:50:16