2011-12-24 13 views
-1

Stop(Id, Name)はJavaクラスです。これらのオブジェクトをjava.util.Setに保存したい場合は、IdStopに従ってこれらのオブジェクトをソートする必要があります。 これは私のコンパレータ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

「正しい結果が与えられていない」とはどういう意味ですか?注文はうんざりしますか?例外を投げますか?世界は終わりますか?サンタさんはバニーに置き換えられましたか? –

+0

正しい順序を与えていないのですか?これを行うにはどうすればequalsメソッドとhashcodeメソッドを実装する必要がありますか?詳細については、入力データ、呼び出し要素、呼び出しスタック、バニーの写真、予想されるサンタのスケッチを入力してください。 –

答えて

2

Stopはコンパレータと同じフィールドで動作するequalsメソッドを実装していますか?そうでなければ問題につながるでしょう。また、オブジェクトをComparableに実装するように切り替えることもできます(これは、表示されている問題を解決しません)。

equals()メソッドを実装したら、同じフィールドで機能するhashCode()メソッドも実装する必要があります。

Findbugsは、おそらくあなたにこれらのことを伝えていたでしょう。その非常に便利な。

0

これはComparatorドキュメントからのものである:要素Sの組に比較器Cによって課さ

順序はIF = equalsと一貫性のみc.compare IF(E1、E2)であると言われています= 0は、S内のすべてのe1およびe2に対してe1.equals(e2)と同じブール値を持ちます。

並べ替えられたセットを並べ替えるためにequalsと矛盾する順序を適用できるコンパレータを使用する場合は注意が必要です地図)。明示的なコンパレータcを持つソートされた集合(またはソートマップ)が、集合Sから引き出された要素(またはキー)とともに使用されると仮定します。 「奇妙に」行動する。特に、ソートされたセット(またはソートされたマップ)は、set(またはmap)の一般規約に違反します。これは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、NAME = 'name66'}、停止{ID = 72、名= 'name72'}、停止{ID = 102、 NAME = 'name102'}]

OFCを使用すると、equalsを実装するために必要とhashcodeようクラスは、各Set実装で一貫して動作しますが、TreeSetため、これはaddremove又はcontains操作(代わりのHashSetequals)を行いながらTreeSetcompareTo方法に依存しているためであるとして動作します。

+0

TreeSetは、put、remove、containsの各操作(HashSetのようなequalsではなく)を実行しているときにcompareToメソッドに依存します。これはまさにこれです。 –

+0

Setインタフェースコントラクトでは、equalsを判定するために 'equals'を使用すべきだと言われていますが、' TreeSet'はほとんど最適化されておらず、 'equlas'ではなくequalityを判定するために' compareTo'を使います。 Stopクラスで。 – Premraj

関連する問題