Set
インデックス値に基づいてからオブジェクトを取得することについて他の質問を見てきましたが、それが不可能な理由を理解しています。しかし、オブジェクトによる取得が許可されていない理由についての適切な説明を見つけることができなかったので、私が尋ねると思いました。
HashSet
がサポートしているHashMap
ので、そこからオブジェクトを取得するのは非常に簡単です。現在のように、の各項目を繰り返し処理して、HashSet
不必要と思われる同等性をテストする必要があるようです。
を使用することもできますMap
が、key:valueのペアは必要ありません。必要なのは、だけです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)
か(この場合は十分です)。