1

我有一个Set<MyClass>已覆盖equalshashCode使用该String name;变量的 Java。

public class MyClass{
    final String name;
    public boolean equals(Object o){...}
    public int hashCode(){return name.hashCode();}
}

无论如何我可以使用类似的东西将我的对象从 HashSet 中取出

MyClass o = set.get("nameofmyobject");

有没有办法在 Java 或数据结构中做到这一点?或者我是否需要将我的所有集合更改为地图?

4

3 回答 3

3

不,您需要更改为Map. 没有Set返回元素的方法。

附录 A
如果您不关心速度,您可以随时手动搜索:

MyClass find(String name, Set<MyClass> set)
{
    MyClass wrapper = new MyClass(name);
    for (MyClass e : set) {
        if (wrapper.equals(e)) {
            return e;
        }
    }
    return null;
}

附录 B
如果你使用 aTreeSet你可以使用floor

MyClass find(String name, TreeSet<MyClass> set)
{
    MyClass wrapper = new MyClass(name);
    MyClass candidate = set.floor(wrapper);
    if (candidate != null && wrapper.equals(candidate)) {
        return candidate;
    } else {
        return null;
    }
}
于 2013-06-11T23:03:05.713 回答
2

看看这个问题。答案是不。Sets 不是为了获取元素,而是为了寻找平等。使用 aMapListinsteed。

于 2013-06-11T23:05:33.440 回答
1

正如蒂姆所说,你不能。如果是这样,您将不得不将其称为 set.get(myClassInstance); 而不是 set.get(存储实例的某些成员)

利用

   Map<String, MyClass> myMap = new HashMap<String, MyClass>();
于 2013-06-11T23:08:48.220 回答