您好
如果您在HashMap<String,String>
中搜索键值对的特定值,则可以编写以下内容:
myHashMap.containsKey(myString);
但是如果密钥不是字符串,我怎么能管理呢?我有一个看起来像这样的课:
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);
}
}
在地图中,我保存了此类型“Kategorie”的键和值。
mapKategorieDEundEN.put(new Kategorie(strName_de), new Kategorie(strName_en));
稍后在代码中,我想检查是否存在具有特定字符串的密钥。
if (mapKategorieDEundEN.containsKey(searchString)) {
...不起作用,因为键不是字符串而是“Kategorie”,这很清楚。
然后我尝试了这样的事情:
if (mapKategorieDEundEN.containsKey(new Kategorie(searchString))) {
......也不行。我假设它找不到任何东西,因为该对象不是“原始”对象而是新对象。
在这种情况下,我可以使用containsKey还是必须在HashMap上使用循环?
答案 0 :(得分:5)
您的课程应该覆盖equals和hashCode,之后会有效。
HashMap / Hashtable通过使用键的hashCode将项放入“桶”中,因此表示与另一个对象相同的值的新对象应该被视为同一个对象必须返回相同的hashCode。返回相同hashCode的所有键将被视为候选,并且将在它们上调用equals。如果equals返回true,则认为是匹配。
答案 1 :(得分:1)
HashMap使用hashCode()
和equals()
。你必须实现它们。如果你不知道怎么做。检查你的IDE(eclipse)通常可以为你生成它们。
答案 2 :(得分:0)
如果要使用compareTo
方法访问对象,则不应使用基于hashCode / equals的Map,而应使用SortedMap,如TreeMap(或ConcurrentSkipListMap)。
这具有额外的好处,它可以启用基于范围的查询(例如“给我所有类别大于这一个”),但是对于简单{{有点慢(O(log n)而不是O(1)) {1}}访问与基于散列的访问相比(具有良好的哈希代码,而不是常量代码)。
对于一般用法类,定义hashCode / equals和compareTo是明智的,那么类的用户可以决定使用哪种类型的映射。 (如果有不同的方法对对象进行排序,最好提供不同的Comparator对象。)
作为旁注,您不应该get
,而应Comparable
。那么您的Comparable<Kategorie>
方法将如下所示:
compareTo