[英]HashMap.containsKey() - how to search for a class?
你好
如果您在HashMap<String,String>
中搜索键值对的特定值,则可以编写以下内容:
myHashMap.containsKey(myString);
但是,如果密钥不是字符串,我该如何管理它? 我有一个 class 看起来像这样:
public class Kategorie implements Comparable {
private String name;
public Kategorie() {
super();
}
public Kategorie(String name) {
setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Object o) {
if (!(o instanceof Kategorie))
throw new ClassCastException();
Kategorie k = (Kategorie)o;
String name = k.getName();
return this.getName().compareTo(name);
}
}
在 map 中,我保存了这种“类别”类型的键和值。
mapKategorieDEundEN.put(new Kategorie(strName_de), new Kategorie(strName_en));
稍后在代码中,我想检查是否有带有特定字符串的键。
if (mapKategorieDEundEN.containsKey(searchString)) {
...不起作用,因为密钥不是字符串而是“类别”,这很清楚。
然后我尝试了这样的事情:
if (mapKategorieDEundEN.containsKey(new Kategorie(searchString))) {
……也不行。 我认为它没有找到任何东西,因为 object 不是“原始” object 而是一个新的。
在这种情况下,我可以完全使用 containsKey 还是必须在 HashMap 上使用循环?
HashMap 使用hashCode()
和equals()
。 你必须实施它们。 如果你不知道怎么做。 检查您的 IDE (eclipse) 通常可以为您生成它们。
如果要使用compareTo
方法访问对象,则不应使用基于 hashCode/equals 的 Map,而应使用 SortedMap,如 TreeMap(或 ConcurrentSkipListMap)。
这有一个额外的好处,它支持基于范围的查询(例如“给我所有大于这个的类别”),但与简单的get
访问相比有点慢(O(log n)而不是 O(1))基于哈希的访问(具有良好的 hash 代码,而不是恒定代码)。
对于一般用途 class,定义 hashCode/equals 和 compareTo 是明智的,然后 class 的用户可以决定使用哪种类型的 map。 (如果有不同的方法对对象进行排序,最好提供不同的 Comparator 对象。)
附带说明一下,您不应该实现Comparable
,而应该实现Comparable<Kategorie>
。 然后您的compareTo
方法将如下所示:
public int compareTo(Kategorie k) {
String name = k.getName();
return this.getName().compareTo(name);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.