1. ホーム
  2. java

[解決済み] セットから要素を取得する

2022-03-23 01:34:33

質問

なぜ Set は、他の要素と等しい要素を取得するための操作を提供していますか?

Set<Foo> set = ...;
...
Foo foo = new Foo(1, 2, 3);
Foo bar = set.get(foo);   // get the Foo element from the Set that equals foo

があるかどうかを問うことができる。 Set と等しい要素が含まれています。 bar なぜ、その要素を取得できないのでしょうか?

明確にするために equals メソッドはオーバーライドされますが、すべてのフィールドではなく、1つのフィールドのみをチェックします。そのため、2つの Foo オブジェクトは同じだと思われていますが、実際には異なる値を持つことがあります。 foo .

解決方法は?

イコールであれば、要素を取得する意味がない。A Map の方がこのユースケースには適しています。


それでもなお、要素を見つけたい場合は、イテレータを使用する以外の選択肢はありません。

public static void main(String[] args) {

    Set<Foo> set = new HashSet<Foo>();
    set.add(new Foo("Hello"));

    for (Iterator<Foo> it = set.iterator(); it.hasNext(); ) {
        Foo f = it.next();
        if (f.equals(new Foo("Hello")))
            System.out.println("foo found");
    }
}

static class Foo {
    String string;
    Foo(String string) {
        this.string = string;
    }
    @Override
    public int hashCode() { 
        return string.hashCode(); 
    }
    @Override
    public boolean equals(Object obj) {
        return string.equals(((Foo) obj).string);
    }
}