繁体   English   中英

HashMap.containsKey() - 如何搜索 class?

[英]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 上使用循环?

您 class 应该覆盖equalshashCode ,之后它将起作用。

HashMap/Hashtable 使用键的 hashCode 将项目放入“桶”中,因此一个新的 object 表示与另一个 object 相同的值,并且应该被视为相同的 ZA8CFDE6331BD59EB2AC96F8911C466 必须返回相同的 hashCode。 所有返回相同 hashCode 的键都将被视为候选键,并且将对它们调用 equals。 如果 equals 返回 true,则认为匹配。

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.

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