インデックス値に基づいてSet
からオブジェクトを取得することに関する他の質問を見てきましたが、なぜそれが不可能なのか理解しています。しかし、なぜオブジェクトによる取得が許可されないのかについての良い説明を見つけることができなかったので、私は尋ねると思いました。
HashSet
はHashMap
によってサポートされているため、そこからオブジェクトを取得するのは非常に簡単です。現時点では、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)
で十分です)。
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));
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)yes、ArrayListの場合
。 2-2)重複がnot含まれる場合、主要なタスクは要素を検索します(含む/削除する)?
。 。 2-2-1)Ifno、ArrayList
。 。 2-2-2)yesの場合、順序は重要ですか?
。 。 。 2-2-2-1)順序がnotである場合、HashSet
。 。 。 2-2-2-2)yesの場合、挿入順序に従うか、値でソートしますか?
。 。 。 。 2-2-2-2-1)ifordered、LinkedHashSet
。 。 。 。 2-2-2-2-2)ifsorted、TreeSet
最後の文章が答えです。
get(Object o)
は、HashSet
に等しい別のオブジェクトを探してo
を実行します(equals(o)
メソッドを使用)。したがって、実際にはcontains(o)
と同じであり、同じ結果を返さないだけです。
new Foo("1");
オブジェクトがset
に既に存在することを知りたい場合は、contains
メソッドを次のように使用する必要があります。
_boolean present = set.contains(new Foo("1"));
_
get
種類のメソッド、つまりset.get(new Foo("1"));
は意味をなさないためサポートされていません。あなたはすでにオブジェクトを持っている、すなわちnew Foo("1")
そして、あなたはget
メソッドを通してどのような追加情報を見ているだろうか。
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の小さなクローンと一緒に暮らすことになります。
ものを保存し、キーを使用して取得するには、マップが必要です。
ハッシュセットの内容のみを知りたい場合は、.toString();
メソッドを使用して、すべてのハッシュセットの内容をコンマで区切って表示できます。
HashSetは、HashMapよりも少し単純です。 HashMapの機能が必要ない場合、なぜそれを使用するのですか? getObject(ObjectType o)のようなメソッドがJavaによって実装された場合、contain()メソッドを呼び出した後にセットを繰り返す必要はありません...