В настоящее время я работаю над играми TD с редактором карт. Теперь, очевидно, вы можете сохранять и загружать эти карты (или должны быть способны, по крайней мере). Проблема: в какой-то момент я звоню .get()
на HashMap
. К сожалению, ключи, которые должны быть одинаковыми (по логике), не являются одним и тем же объектом (в терминах ссылок), и, согласно моим предыдущим исследованиям Google, переопределение их метода .equals
недостаточно, поскольку они все еще возвращают разные хэши с .hashCode()
(я подтвердил, что они возвращают разные хеши, а .equals
действительно возвращает true).
(На стороне записки, это довольно странно, так как Javadoc из HashMap.get(key)
только утверждает, что они должны быть равны)HashMap.get() не возвращает правильное значение, благодаря «hashCode()»
Более конкретно, HashMap
содержит экземпляры класса Path
шахты в качестве ключей, и должен вернуть соответствующий список врагов (= значение).
короткая версия Path
(без добытчиков и т.д.):
public class Path
{
private List<Tile> tiles = new ArrayList<>();
@Override
public boolean equals(Object obj) {
//code comparing the two paths
}
@Override
public int hashCode() {
//what I still need to implement. ATM, it returns super.hashCode()
}
}
public class Tile
{
private int x;
private int y;
//constructor
//overrides equals
//getters & some convenience methods
}
Теперь, если два пути равны, я бы хотел, чтобы вернуть тот же хэш-код, так что HashMap
возвращает правильный список враги. (Я буду уверен, что не могут быть добавлены два одинаковых пути).
Теперь мой вопрос:
ли вы предложить
- используя некоторую внешнюю библиотеку для генерации хэша-
- , что я пишу свою собственную реализацию вычисления хэша или
- что-то другое
?
Обратите внимание, что я бы предпочел не менять HashMap
на другой тип карты, если это даже поможет решить проблему.
ваш '3)' возможно, возможно, использует вашу IDE или IDE в качестве генератора для генерации 'hashcode' – SomeJavaGuy
, вы можете сделать свой хэш-код простым или сложным, как вам нравится. это означает, что «эти две смутно симлярные» проверки позволяют устранить как можно больше дико отличающихся совпадений до того, как вы погрузитесь в свой метод «равно» для тех, кто выживает при проверке хэш-кода. Таким образом, в зависимости от вашей системы 'return tiles.size()' может быть даже уместным! –
стоит добавить: одна ошибка, сделанная людьми, заключается в том, чтобы сделать hashcode чрезмерно сложным. нет смысла иметь это, если это будет просто сложнее, чем фактический метод 'equals'. как я сказал: это означает «быстрая проверка». –