web-dev-qa-db-ja.com

Java.util.HashSetにget(Object o)メソッドがないのはなぜですか?

インデックス値に基づいてSetからオブジェクトを取得することに関する他の質問を見てきましたが、なぜそれが不可能なのか理解しています。しかし、なぜオブジェクトによる取得が許可されないのかについての良い説明を見つけることができなかったので、私は尋ねると思いました。

HashSetHashMapによってサポートされているため、そこからオブジェクトを取得するのは非常に簡単です。現時点では、HashSetの各項目を反復処理し、不要と思われる同等性をテストする必要があるようです。

Mapを使用できますが、キーと値のペアは必要ありません。Setが必要です。

たとえば、_Foo.Java_があるとします:

_package example;

import Java.io.Serializable;

public class Foo implements Serializable {

    String _id;
    String _description;

    public Foo(String id){
        this._id = id
    }

    public void setDescription(String description){
        this._description = description;
    }

    public String getDescription(){
        return this._description;
    }

    public boolean equals(Object obj) {
        //equals code, checks if id's are equal
    }

    public int hashCode() {
        //hash code calculation
    }

}
_

および_Example.Java_:

_package example;

import Java.util.HashSet;

public class Example {

    public static void main(String[] args){
        HashSet<Foo> set = new HashSet<Foo>();

        Foo foo1 = new Foo("1");
        foo1.setDescription("Number 1");

        set.add(foo1);
        set.add(new Foo("2"));

        //I want to get the object stored in the Set, so I construct a object that is 'equal' to the one I want.
        Foo theFoo = set.get(new Foo("1")); //Is there a reason this is not allowed?
        System.out.println(theFoo.getDescription); //Should print Number 1
    }

}
_

Equalsメソッドは、「論理」等式ではなく「絶対」等式をテストすることを目的としているためですか(この場合、contains(Object o)で十分です)。

57
FGreg

Setは、a.equals(b) == trueを重複として扱うオブジェクトのCollectionであるため、既にあるオブジェクトを取得しようとすることは意味がありません。

コレクションからget(Object)をしようとしている場合、Mapがより適切である可能性があります。

あなたが書くべきことは

Map<String, String> map = new LinkedHashMap<>();

map.put("1", "Number 1");
map.put("2", null);
String description = set.get("1");

オブジェクトがセットにない場合(等しいに基づいて)、追加します。セットにある場合(等しいに基づいて)、そのオブジェクトのセットのインスタンスを提供します

万一、これが必要な場合は、Mapを使用できます。

Map<Bar, Bar> map = // LinkedHashMap or ConcurrentHashMap

Bar bar1 = new Bar(1);
map.put(bar1, bar1);

Bar bar1a = map.get(new Bar(1));
24
Peter Lawrey

Java Map/Collection Cheat Sheet

キー/値のペアまたは値のみが含まれますか?

1)pairsが含まれている場合、選択肢はマップです。順序は重要ですか?

。 1-1)yesの場合、挿入順に従うか、キーでソートしますか?

。 。 1-1-1)注文した場合、LinkedHashMap

。 。 1-1-2)ソートされている場合、TreeMap

。 1-2)順序がnot重要である場合、HashMap

2)valuesのみを保存する場合、選択肢はコレクションです。重複が含まれますか?

。 2-1)yesArrayListの場合

。 2-2)重複がnot含まれる場合、主要なタスクは要素を検索します(含む/削除する)?

。 。 2-2-1)IfnoArrayList

。 。 2-2-2)yesの場合、順序は重要ですか?

。 。 。 2-2-2-1)順序がnotである場合、HashSet

。 。 。 2-2-2-2)yesの場合、挿入順序に従うか、値でソートしますか?

。 。 。 。 2-2-2-2-1)iforderedLinkedHashSet

。 。 。 。 2-2-2-2-2)ifsortedTreeSet

46
rsb2097

最後の文章が答えです。

get(Object o)は、HashSetに等しい別のオブジェクトを探してoを実行します(equals(o)メソッドを使用)。したがって、実際にはcontains(o)と同じであり、同じ結果を返さないだけです。

5
xlecoustillier

new Foo("1");オブジェクトがsetに既に存在することを知りたい場合は、containsメソッドを次のように使用する必要があります。

_boolean present =  set.contains(new Foo("1"));
_

get種類のメソッド、つまりset.get(new Foo("1"));は意味をなさないためサポートされていません。あなたはすでにオブジェクトを持っている、すなわちnew Foo("1")そして、あなたはgetメソッドを通してどのような追加情報を見ているだろうか。

4
Yogendra Singh

Getがない理由は簡単です:

セットからオブジェクトXを取得する必要があるのは、Xから何かを必要とし、オブジェクトを持っていないためです。

オブジェクトがない場合は、それを見つけるための何らかの手段(キー)が必要です。 ..その名前、これまでの数字。それが正しい地図です。

map.get( "key")-> X!

セットにはキーがありません。オブジェクトを取得するには、それらをトラバースする必要があります。

便利なget(X)-> Xを追加してみませんか

あなたはすでにXを持っているので、それは正しいことではありません、純粋主義者は言うでしょう。

しかし、今では非純粋主義として見て、本当にこれが必要かどうかを確認してください:

Set.get(Y)-> Xとなるように、Xに等しいオブジェクトYを作成するとします。 Volia、それから私は持っていたXのデータにアクセスできます。たとえば、Xにはget flag()というメソッドがあり、その結果が欲しいとします。

次に、このコードを見てください。

Y

X = map.get(Y);

Y.equals(x)true!

しかし..

Y.flag()== X.flag()= false。 (等しくなかった?)

ですから、もしセットがそのようなオブジェクトを取得することを許可したなら、それは確かに等しいの基本的なセマンティックを破ることです。後で、Xの小さなクローンと一緒に暮らすことになります。

ものを保存し、キーを使用して取得するには、マップが必要です。

0
Alex Vaz

ハッシュセットの内容のみを知りたい場合は、.toString();メソッドを使用して、すべてのハッシュセットの内容をコンマで区切って表示できます。

0
Lins Louis

HashSetは、HashMapよりも少し単純です。 HashMapの機能が必要ない場合、なぜそれを使用するのですか? getObject(ObjectType o)のようなメソッドがJavaによって実装された場合、contain()メソッドを呼び出した後にセットを繰り返す必要はありません...

0
user07