2017-07-27 2 views
-2
  for(Context context : contexts) { 

       if(context.equals(c)){ 
        System.out.println(context.equals(c)+" : "+contexts.contains(c)); 
       } 
      } 

は私にイコール()と一見

が、これは任意の出力を生成する場合、それは "真:true" を作るべきであると思わTreeSetの標準的なJavaでコンテキスト矛盾)(含まれています。不思議なことに、それはいつも「真:偽」で戻ってくる。

ドキュメントを参照してください。私は本質的に.contains関数が何をしているのかを正確に再現していますが、まだ別の結果を得ています。

誰でもこれを説明できますか?

EDIT:Javaドキュメント(コレクション)から:

コレクションに指定された要素が含まれている場合にtrueを返します。より正式には、このコレクションに、(o == null?e == null:o.equals(e))などの少なくとも1つの要素eが含まれている場合にのみtrueを返します。

+0

カスタムの場合は 'Context'ソースを提供するか、パブリックにアクセスできる場合はパッケージを含む完全修飾名を提供してください。 –

+0

@SergeyProkofievどちらもありません。それが問題になるTreeSetの実装であるかどうかにかかわらず、なぜそれが問題であるべきかわからない。 –

+1

いいえ、あなたの実装は 'equals()'と 'compareTo()'の実装です。 –

答えて

2

hashcodeの実装では、equalsでジブが表示されない可能性があります。

は、にhashcodeを使用する必要があります。次に、であるかどうかを確認するために、equalsを使用しているかどうかを確認します。

私はあなたがtrue:falseを取得しているならば、あなたは二つのオブジェクトのための

equalsもし戻っtrueは、2つのオブジェクトのhashcode同じを返すように、あなたのhashcode実装を修正する必要があることが示唆しています。

TreeSetの場合となる場所はcompareToとなりますので、そこに相当します。

+3

'TreeSet'のhashCode? – RealSkeptic

+0

ヘッドアップありがとう。 – OldCurmudgeon

+0

ハッシュコードは実際には問題ありません。 TreeSetの代わりにHashSetを使うと、私は '通常の'結果を得ています。 –

関連する問題