Как исправить HashMap, обновляя каждое существующее значение вместо одного значения - PullRequest
0 голосов
/ 15 апреля 2019

Я работал над проблемой кодирования пьяного ходока (пользовательские классы и т. Д.), И я схожу с ума, пытаясь исправить эту маленькую проблему.

Я возился с кодом (длябезрезультатно) и поэтому, не видя никакой надежды, я решил получить внешнее мнение.

Код, который я использовал для добавления в hashmap, выглядит так:

if (hashMap.containsKey(key) == false) {
    hashMap.put(key, 1);
}
else {
    hashMap.put(key, value + 1);
}

Теоретическиэто должно быть совершенно нормально.Если ключ не сохранен на карте, он добавляется к карте со значением 1. Если ключ фактически присутствует на карте, то значение увеличивается на единицу.Ключ - это просто экземпляр пользовательского класса, который принимает две целочисленные переменные.Он постоянно обновляется.

В конце программы, если я отображаю записи в хэш-карте со значениями больше 1, он должен выглядеть примерно так:

Visited Intersection [avenue=8, street=42] 3 times!
Visited Intersection [avenue=8, street=63] 2 times!

Но когдаЯ наблюдал, как хэш-карта выглядела при каждом вызове функции, она выглядела так:

Hash Map: {Intersection [avenue=6, street=22]=1}

Hash Map: {Intersection [avenue=6, street=23]=1, Intersection 
[avenue=6, street=23]=1}

Hash Map: {Intersection [avenue=6, street=22]=2, Intersection 
[avenue=6, street=22]=1}

Hash Map: {Intersection [avenue=5, street=22]=2, Intersection 
[avenue=5, street=22]=1, Intersection [avenue=5, street=22]=1}

Hash Map: {Intersection [avenue=6, street=22]=3, Intersection 
[avenue=6, street=22]=1, Intersection [avenue=6, street=22]=1}

...

Каждая запись в хэш-карте перезаписывалась, и конечный продукт был таким:

Visited Intersection [avenue=8, street=20] 3 times!
Visited Intersection [avenue=8, street=20] 2 times!
Visited Intersection [avenue=8, street=20] 2 times!
Visited Intersection [avenue=8, street=20] 2 times!
...

Первоначально я думал, что код для добавления в hashmap был неправильным, поскольку каждый ключ перезаписывался и отображался только последний обновленный, но теперь я думаю, что это связано с фактическим обновлением ключа.

Пенни за ваши мысли?Извините, если это немного расплывчато.

1 Ответ

7 голосов
/ 15 апреля 2019

Каждая запись в хэш-карте была перезаписана ...

Я подозреваю, что вы не совсем понимаете, как работает HashMap.HashMap сохраняет ссылку на key, а не копию.Я подозреваю, что вы перезаписываете поля в Intersection после того, как поместили их в карту.Это очень плохой паттерн и может привести к очень странным результатам.

Несколько вещей для проверки.

  • Вы должны сделать new Intersection(avenue, street)каждый раз.
  • Подумайте о том, чтобы 2 поля в вашем Intersection были final.Это всегда хороший шаблон, поэтому вы не можете случайно изменить значение ключа.Если одно или оба из этих полей являются полем «идентификатор», оно должно быть final.
  • . Необходимо убедиться, что объект Intersection имеет соответствующие методы hashcode() и equals(), которыеправильно определяет каждое значение.В противном случае каждый Intersection будет сохранен на карте независимо от того, имеют ли они одинаковые значения avenue и street.Смотрите мой ответ здесь: https://stackoverflow.com/a/9739583/179850
  • Вы должны получить счетчик пересечений с карты и затем увеличить значение.

Может быть что-то вроде:

Intersection key = new Intersection(8, 42);
...
Integer count = hashMap.get(key);
if (count == null) {
   hashMap.put(key, 1);
} else {
   hashMap.put(key, value + 1);
}
...
public class Intersection {
   // these fields can't be changed
   private final int avenue;
   private final int street;
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...