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

Bev*_*vor 5 java search hashmap

您好,
如果您搜索HashMap<String,String>键值对的特定值,则可以编写以下内容:

myHashMap.containsKey(myString);
Run Code Online (Sandbox Code Playgroud)

但是,如果密钥不是字符串,我该如何管理呢?我有一个看起来像这样的课:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

在地图中,我保存了此类型"Kategorie"的键和值.

mapKategorieDEundEN.put(new Kategorie(strName_de), new Kategorie(strName_en));
Run Code Online (Sandbox Code Playgroud)

稍后在代码中,我想检查是否存在具有特定字符串的键.

if (mapKategorieDEundEN.containsKey(searchString))  {
Run Code Online (Sandbox Code Playgroud)

...不起作用,因为键不是字符串而是"Kategorie",这很清楚.

然后我尝试了这样的事情:

if (mapKategorieDEundEN.containsKey(new Kategorie(searchString)))  {
Run Code Online (Sandbox Code Playgroud)

......也行不通.我认为它没有找到任何东西,因为该对象不是"原始"对象而是新对象.

在这种情况下,我可以使用containsKey还是必须在HashMap上使用循环?

Kaj*_*Kaj 5

你的类应该覆盖equalshashCode,之后它会工作.

HashMap/Hashtable通过使用键的hashCode将项放入"桶"中,因此表示与另一个对象相同的值的新对象应该被视为同一个对象,该对象必须返回相同的hashCode.返回相同hashCode的所有键将被视为候选,并且将在它们上调用equals.如果equals返回true,则认为匹配.

  • 您应该在hashcode方法中包含用于equals方法的字段.如果你使用Eclipse,我建议使用向导生成hashcode和equals(右键单击,然后是Source - > Generate hashcode和equals).我敢肯定,其他IDE也有一个向导. (2认同)