2013-05-03 2 views
0

Предположим, у меня есть HashMap:HashMap - используя пользовательские данные объекты

HashMap<MyKey, Integer> HM = new HashMap<MyKey, Integer>(); 

MyKey соответствует объекту данных с двумя целочисленными элементами (и конструктор для прохождения двух целых чисел).

HM.put(new MyKey(1,1234), 1); // this seems to work... 

, но я не могу использовать его:

System.out.println(HM.containsKey(new MyKey(1,1234))); 

Я получаю ложь.

Возможно, у HashMap есть пользовательский объект данных для ключа? Что мне не хватает? Спасибо ...

ответ

1

Вы должны переопределить метод и hashcode() в вашем классе MyKey (или любой другой пользовательский класс, который будет входить в HashMap или Set). Таким образом, когда вы скажете containsKey() (или метод Set , или equals()), вы бы явно указали, какие свойства MyKey проверяют на сдерживание или равенство.

Вы могли бы иметь простой equals() и hashCode() метод, как это в вашем классе MyKey

@Override 
public boolean equals(Object o) { 
    boolean result = false; 
    if (o instanceof MyKey) { 
     MyKey mykey = (MyKey) o; 
     result = (this.getX() == mykey.getX() && mykey.getY() == mykey.getY()); 
    } 
    return result; 
} 

@Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + X; 
     result = prime * result + Y; 
     return result; 
    } 

(Предполагая, что поля в классе MyKey являются X и Y)

+0

Если я попытаюсь: System.out.println (HM.containsKey (MyKey (1,1234))); –

+0

Затем я получаю «не могу найти символ» (ссылаясь на MyKeys). Лингвистически я нахожу довольно странным, что могу поместить элемент в него, но тогда у меня действительно должен быть первоначально заданный элемент, а не его копия. В любом случае, спасибо за помощь. Я повторяю HashList, чтобы найти фактический элемент. –

+0

@n как Я отредактировал свой ответ. При переопределении равных, hashCode также должен быть переоценен. Также см. Это: http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java Надеюсь, что это поможет. – Shobit

0

В вашей System.out вы генерируете new MyKey(). Вы хотите проверить, содержит ли ваша хэш-карта MyKey(1,1234), а не new MyKey(1,1234).

+0

но если он компилирует, это означает ' containsKey' действительно требует указателя, не так ли? – Elazar

+0

Не обязательно - это зависит от конкретной реализации hashmap, которую использует OP. Он мог бы так же удачно скомпилировать новый оператор (и никогда не возвращать true), как это могло бы быть со ссылкой на существующий объект. – NWard

Смежные вопросы