#java #hashmap #equals #hashcode
#java #hashmap #равно #хэш-код
Вопрос:
Допустим, у меня есть объект, который имеет диапазон чисел в виде двух свойств, начала и конца, чтобы определить диапазон чисел. Я хочу загрузить эти объекты в HashMap. Но когда я просматриваю хэш-код и equals с ключевым объектом, я хочу сопоставить с заданным числом, которое попадает в диапазон. Итак, я хочу, чтобы хэш-код и равно принимали любое число в ключе и возвращали объект, где он находится между начальным диапазоном и конечным диапазоном. Итак, если объект имеет начальный диапазон 7 и конечный диапазон 14, передача 9 в ключе приведет к извлечению этого объекта. Как мне это сделать? Значения были бы простыми, поскольку я бы использовал >= и <= , но я не хочу нарушать хэш-код… Я знаю, что могу выполнять итерацию по элементам, но я бы хотел избежать этого по соображениям производительности.
public class MyClass {
private final int marketID;
private final int startRange;
private final int endRange;
...
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result marketID;
/*I don't want to match on startRange and endRange, I want to fall between it! */
result = prime * result endRange;
result = prime * result startRange;
return resu<
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyClass other = (MyClass) obj;
if (endRange!= other.endRange)
return false;
if (marketID != other.marketID)
return false;
if (startRange!= other.startRange)
return false;
return true;
}
}
Комментарии:
1. Используйте
TreeMap
, а неHashMap
. У него есть методы для такого рода вещей.2. Хорошо, потрясающе … если мне нужно сделать это потокобезопасным, могу ли я использовать ConcurrentSkipMap для выполнения этого тоже?
3. Я не понимаю, почему нет. Почему бы вам не попробовать это?
4. Вы создаете гистограмму или сортировку по корзинам? Для них хитрость заключается в том, что вы делаете математику перед доступом к карте, поэтому что-то вроде
map.get(value / 10)
5. С
TreeMap
вы сохраните порядок элементов, которые вы добавляете к нему, но проблема в том, что вы не можете переопределить equals (более правильно contains метод), чтобы проверить, содержит ли этот элемент (между некоторым диапазоном) и, в конце концов, извлекать этот элемент в постоянное время. То, что вы ищете в хэш-таблице (любой карте), является подписью экземпляра объекта, а не их значениями. Итак, вы не можете избежать повторения ключей по соображениям производительности.