HashMap.containsKey () - как искать класс? - PullRequest
5 голосов
/ 06 июня 2011

Hello
Если вы ищете в 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))  {

... не работает, потому что ключ не строка, а «категория», это понятно.

Затем я попробовал что-то вроде этого:

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

... тоже не работает.Я предполагаю, что он ничего не находит, потому что объект - это не «оригинальный» объект, а новый.

В этом случае я могу вообще использовать containsKey или мне нужно использовать цикл надHashMap?

Ответы [ 3 ]

5 голосов
/ 06 июня 2011

Ваш класс должен переопределить равно и hashCode , после этого он будет работать.

HashMap / Hashtable помещает элементы в «корзины», используя hashCode ключа, поэтому новый объект, представляющий то же значение, что и другой объект, и который должен рассматриваться как тот же объект, должен возвращать тот же hashCode. Все ключи, которые возвращают один и тот же хэш-код, будут считаться кандидатами, и на них будут вызываться равные. Это считается совпадением, если равно равно true.

1 голос
/ 06 июня 2011

HashMap использует hashCode() и equals(). Вы должны их реализовать. Если ты не знаешь как. Проверьте, что ваша IDE (eclipse) обычно может генерировать их для вас.

0 голосов
/ 06 июня 2011

Если вы хотите получить доступ к вашим объектам, используя метод compareTo, вам не следует использовать карту на основе hashCode / equals, а только SortedMap, например TreeMap (или ConcurrentSkipListMap).

Это дает дополнительное преимущество, заключающееся в том, что он разрешает запросы на основе диапазона (например, «дать мне все категории больше этой»), но немного медленнее (O (log n) вместо O (1)) для простых get доступа по сравнению с доступом на основе хеша (с хорошим хеш-кодом, а не с постоянным).

Для класса общего использования было бы целесообразно определить hashCode / equals и compareTo, тогда пользователь класса может решить, какой тип карты использовать. (Если существуют разные способы сортировки объектов, лучше предоставьте разные объекты Comparator.)

В качестве дополнительного замечания вы не должны реализовывать Comparable, но Comparable<Kategorie>. Тогда ваш compareTo метод будет выглядеть так:

public int compareTo(Kategorie k) {
    String name = k.getName();
    return this.getName().compareTo(name);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...