#java
#java
Вопрос:
Здравствуйте, я не могу найти никакой информации о том, что мне нужно сделать, чтобы два ключа казались равными. То есть мне нужно предоставить пользовательский метод сравнения, который будет использоваться map.put(), реализация comparable не помогает.
Например, этот код работает не так, как предполагалось — для целей моей программы два ключа n и n2 одинаковы.
private class N implements Comparable<N> {
int value;
int stuff;
String z;
@Override
public int compareTo(N arg0) {
if (arg0.z.equals(z))
return 0;
return 1;
}
}
public void dostuff() {
HashMap m = new HashMap();
N n = new N();
n.z = "1";
N n2 = new N();
n2.z = "1";
m.put(n, "one");
m.put(n2, "two");
// will print refs to two instances! - wrong
Iterator it = m.keySet().iterator();
while (it.hasNext()) {
System.err.println(it.next());
}
}
Ответ №1:
Вам нужно переопределить equals
и hashCode
— HashMap
не использует compareTo
, который предназначен для сортировки.
Обратите внимание, что ваша compareTo
реализация уже нарушена, поскольку на самом деле это только проверка на равенство. В частности, x.compareTo(y)
и y.compareTo(x)
оба возврата 1 нарушают соглашение о compareTo
:
Разработчик должен обеспечить sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) для всех x и y .
Комментарии:
1. хороший улов, я не понимал, что compareTo () предназначен для установления порядка среди объектов
2. @Saideira: Ключ в чтении документов: «Этот интерфейс налагает полный порядок на объекты каждого класса, который его реализует» . 😉