Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HashMap.containsKey() - how to search for a class?

Hello
if you search in an HashMap<String,String> for a specific value of a key-value-pair, you can write the following:

myHashMap.containsKey(myString);

But how can I manage it if the key is not a string? I have a class which looks like this:

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

    }
}

In a map I saved keys and values of this type "Kategorie".

mapKategorieDEundEN.put(new Kategorie(strName_de), new Kategorie(strName_en));

Later in the code, I want to check if there is a key with a specific string.

if (mapKategorieDEundEN.containsKey(searchString))  {

...doesn't work, because the key is not a string but a "Kategorie", that's clear.

Then I tried something like this:

if (mapKategorieDEundEN.containsKey(new Kategorie(searchString)))  {

...doesn't work too. I assume that it doesn't find anything because the object is not the "original" object but a new one.

In this case, can I use containsKey at all or do I have to use a loop over the HashMap?

like image 295
Bevor Avatar asked Jun 06 '11 07:06

Bevor


2 Answers

You class should override equals and hashCode, it will work after that.

The HashMap/Hashtable puts the items in "buckets" by using the hashCode of the key, so a new object that represents the same value as another object, and which should be considered as the same object must return the same hashCode. All keys that return the same hashCode will then be considered as candidates, and equals will be invoked on them. It's considered a match if equals returns true.

like image 62
Kaj Avatar answered Oct 24 '22 11:10

Kaj


HashMap uses hashCode() and equals(). You have to implement them. If you don't know how. Check your IDE (eclipse) usually can generate them for you.

like image 24
Op De Cirkel Avatar answered Oct 24 '22 10:10

Op De Cirkel