2017-12-08 5 views
1

私はJavaを学ぼうとしていますが、HashSetの部分に到達しました。HashSet.containsはfalseでないときに返します

public static void main(String[] args) { 
    HashSet<Integer> firstSet = new HashSet<>(); 
    firstSet.add(3); 

    HashSet<Integer> secondSet = new HashSet<>(); 
    secondSet.add(3); 

    boolean var = firstSet.contains(secondSet); 

    System.out.println(var); 

} 

このコードは、falseを返している間はtrueを返します。助けて! containsためdocs

+6

[containsとcontainsAllの違いがあります](https://stackoverflow.com/a/14511683/7366707)。最初のセットは2番目のセットの_elements_をすべて含んでいますが、2番目のセット自体は含まれていません。 – Moira

+0

firstSet.add(3)の代わりに、最初のHashSetが第2のHashSetではなくHashSet自体の値を含んでいるかどうかを確認しています。 firstSet.add(secondSet)を実行し、最初のセットの汎用パラメータが結果が真である場合よりも>でした。 – prsvr

+0

はい、はい、containsの代わりにcontainsを使用していたはずです。ありがとうございました。 –

答えて

1
boolean var = firstSet.contains(secondSet); 

あなたは明らかに虚偽である、それ自体がsecondSetfirstSet全体かどうかをチェック、secondSetから特定の要素の存在を確認していないので、この行は、問題を引き起こしています。

たとえば、. contains(secondSet.get(0))または.contains(3)の場合は、チェックしてください。

firstSetsecondSetのすべての要素が含まれているかどうかを確認する場合は、firstSet.containsAll(secondSet)を使用できます。

4

見てみましょう:セットが、指定された要素が含まれている場合

trueを返します。より正式には、このセットに(o==null ? e==null : o.equals(e))のような要素eが含まれている場合にのみtrueを返します。

ヌル値が存在しないことをすべて知っているので、は、o.equals(e)の場合にtrueを返します。

oは、containsに渡すパラメータであり、HashSetです。 eは、最初のセットの要素で、Integerにする必要があります。 IntegerHashSetは無関係なタイプなので、等しくなることはほとんどありません。

ここでは論理的なエラーが発生したようです。セットが別のセットのスーパーセットであるかどうかを確認するには、

このコレクションには、指定されたコレクション内のすべての要素が含まれている場合はtrueを返します。

+1

' contains'がなぜ 'E'の代わりに' Object'をとるのか聞いてみると、このような間違いは不可能です。歴史的な理由と後方互換性のためです。 'HashSet'ジェネリックスがJavaに追加される前にすでに存在していました。'contains'メソッドを' Object'の代わりに 'E'を取るように変更することはできませんでした。これは、後方互換性を損なうためです。 – Jesper

関連する問題