Хэш-код / Равно переопределяется диапазоном чисел, а не прямым равенством?

#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 метод), чтобы проверить, содержит ли этот элемент (между некоторым диапазоном) и, в конце концов, извлекать этот элемент в постоянное время. То, что вы ищете в хэш-таблице (любой карте), является подписью экземпляра объекта, а не их значениями. Итак, вы не можете избежать повторения ключей по соображениям производительности.