繁体   English   中英

HashSet.contains()的用法

[英]Usage of HashSet.contains()

我有一个有3个属性的类。 其中一个属性用作唯一键,因此我在equalshashcode方法中使用了一个键。

现在一旦构建了集合,在查找期间,我只有主键(唯一键),我将不得不用唯一键构造一个虚拟对象,并将其他两个值设置为0(默认值)然后我说

Chapter myObject = new Chapter(uniqueKey,0,0);
hashSet.contains(myObject); // This will work.

这是Hashset查找的正确用法吗? 还有其他更好的方法,因为我不喜欢在对象上设置虚假值。

使这个更uniqueKey一种方法是定义一个Chapter()构造函数,它接受一个uniqueKey参数并填充其余参数,然后使用:

hashSet.contains(new Chapter(uniqueKey));

因为你反正扔掉了这个物体。

但是,由于你有一个uniqueKey ,我认为它对于每个Chapter实例都是唯一的,你考虑过使用HashMap吗? 然后你可以使用uniqueKey作为键,你只需要检查键是否存在(例如:使用HashMap.containsKey() ):

hashMap.containsKey(uniqueKey);

使用HashMap,您还可以使用.get()获取所需的对象:

Chapter c = hashMap.get(uniqueKey);

这会给你的Chapter对象,如果所提供的uniqueKey映射到一个对象,或者null ,如果没有。

通常在这种情况下,您应该考虑将关键字段重构为单独的键类,然后使用HashMap而不是HashSet 这避免了创建整个虚拟对象的需要; 所需的只是您创建密钥的实例。

public class Foo {
  public static class Key {
    private final String s;
    private final int i;

    public Key(String s, int i) {
      this.s = s;
      this.i = i;
    }

    // TODO: Implement equals / hashCode.
  }

  private final Key key;
  private final double d;

  public class Foo(String s, int i, double d) {
    this(new Key(s, i), d);
  }

  public class Foo(Key key, double d) {
    this.key = key;
    this.d = d;
  }

  public Key getKey() { return key; }      

  // TODO: Implement equals / hashCode to delegate to Key.
}

然后创建对象并将其添加到地图中,如下所示:

Foo foo1 = new Foo("Hello", 5, 10.0);
Foo foo2 = new Foo("Goodbye", 10, 20.0);

Map<Foo.Key, Foo> foosByKey = new HashMap<Foo.Key, Foo>();

foosByKey.put(foo1.getKey(), foo1);
foosByKey.put(foo2.getKey(), foo2);

...只需创建一个Key实例即可查询地图:

if (foosByKey.contains(new Foo.Key("Hello", 5))) {
  System.err.println("BOOM!");
}

如果你想要查找,你可能最好使用HashMap而不是HashSet。 然后你可以使用主键作为地图中的键,并将对象作为值,然后就可以了

MyObject o = map.get(myKey);

你的方法似乎有点圆。 为什么不保留一组钥匙? 或者,如果需要通过密钥访问对象,则应使用HashMap而不是HashSet

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM