【问题标题】:Using a Set with one Class but find with a String使用带有一个类的集合但使用字符串查找
【发布时间】:2013-06-07 22:59:34
【问题描述】:

我有一个 Java Set<MyClass>,我在其上覆盖了 equalshashCode 以使用 String name; 变量。

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

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

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

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

【问题讨论】:

    标签: java map set


    【解决方案1】:

    没有。您需要更改为MapSet 的所有方法都没有返回元素。

    附录 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
    如果你使用TreeSet,你可以使用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;
        }
    }
    

    【讨论】:

    • 我确实关心速度,这就是我使用 set 的原因,现在必须移动到地图上。我只是不高兴将空间要求增加 O(n) 以存储(在我看来)冗余键
    • @JaySmith 它不会占用更多空间。 Java 的HashSet 是使用HashMap 实现的。请参阅JDK7 source
    • 感谢汤姆的链接,从来不知道
    【解决方案2】:

    看看this的问题。答案是不。 Sets 不是为了获取元素,而是为了寻找平等。使用MapList insteed。

    【讨论】:

    • 一个列表授予O(n) 访问权限。还不如只遍历集合。
    • 我喜欢那个问题的链接。我没有看到那个。即使那个问题也不能真正解释为什么:(
    • 如果您在 Set 中查找对象,您已经拥有该对象,否则我猜您找不到它。那么为什么在相等性检查之后不使用 Object 呢?
    • 注意我的问题,我没有对象,我只有 key 代表对象的相等
    【解决方案3】:

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

    使用

       Map<String, MyClass> myMap = new HashMap<String, MyClass>();
    

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多