Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashSet.contains()的用法_Java_Set - Fatal编程技术网

Java HashSet.contains()的用法

Java HashSet.contains()的用法,java,set,Java,Set,我有一个具有3个属性的类。其中一个属性用作唯一键,因此我在等于和hashcode方法中使用该键 现在,一旦建立了集合,在查找过程中,我只有主键(唯一键),我必须用唯一键构造一个虚拟对象,并将其他两个值设置为0(默认值),然后我说 Chapter myObject = new Chapter(uniqueKey,0,0); hashSet.contains(myObject); // This will work. 这是哈希集查找的正确用法吗?还有其他更好的方法吗,因为我不喜欢在对象上设置假值。

我有一个具有3个属性的类。其中一个属性用作唯一键,因此我在
等于
hashcode
方法中使用该键

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

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

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

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

hashSet.contains(new Chapter(uniqueKey));
因为你无论如何都要扔掉这个东西

但是,由于您有一个
uniqueKey
,我假设它对于
章节的每个实例都是唯一的,您是否考虑过使用
HashMap
?然后您可以使用
uniqueKey
作为键,只需检查键是否存在(例如:使用):

使用HashMap,您还可以通过
获取所需的对象。get()


这将给你<代码>章节对象,如果提供的<代码> UnjKey < /COD>映射到一个对象,或者<代码> null <代码>如果不是。

< P>典型地,在这种情况下,你应该考虑将你的关键字段重构成一个单独的键类,然后使用<代码> HashMap < /C> >而不是使用<代码> HasStuts。这避免了创建整个虚拟对象的需要;所需的只是创建密钥的实例

示例

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);

如果需要查找,最好使用HashMap而不是HashSet。然后可以使用主键作为贴图中的键,对象作为值,然后可以执行以下操作

MyObject o = map.get(myKey);

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

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);
if (foosByKey.contains(new Foo.Key("Hello", 5))) {
  System.err.println("BOOM!");
}
MyObject o = map.get(myKey);