#java #hashmap
#java #хэш-карта
Вопрос:
У меня есть хэш-карта с ключом в виде целого числа и значением в виде списка дат. Я пытаюсь обновить одно из значений для определенного целого числа. Изначально даты будут одинаковыми для всех ключей.
Теперь я хочу установить одну из дат как нулевую для 101 ключа, когда я обновляю конкретный ключ, он обновляется для всех ключей. Что я делаю не так? Пожалуйста, предложите.
Вот мой код
Изначально даты устанавливаются следующим образом
// Set dates to all records
resultDate = [Mon Jan 01 00:00:00 IST 2018, Fri Dec 31 00:00:00 IST 9999] // Typo here
Set<Integer> records= parsedResults.keySet();
if (records.size() > 0) {
for (Integer record: records) {
dateMap.get(Integer.parseInt(record));
dateMap.put(record,resultDate);
}
}
Затем обновление конечной даты как null только для 101
for (Map.Entry<Integer, List<Date>> entry : dateMap.entrySet()) {
if(entry.getKey().equals(Integer.parseInt("101"))) {
List<Date> dates = entry.getValue();
if(null == effDate) {
dates.set(0, null);
} else {
dates.set(0, effDate);
}
if(null == endDate) {
dates.set(1, null);
} else {
dates.set(1, endDate);
}
dateMap.put(Integer.parseInt("101"), dates);
}
}
Первоначальный ответ dateMap
{101=[Mon Jan 01 00:00:00 IST 2018, Fri Dec 31 00:00:00 IST 9999], 102=[Mon Jan 01 00:00:00 IST 2018, Fri Dec 31 00:00:00 IST 9999], 103=[Mon Jan 01 00:00:00 IST 2018, Fri Dec 31 00:00:00 IST 9999]}
После того, как я обновлю как null, тогда,
{101=[Mon Jan 01 00:00:00 IST 2018, null], 102=[Mon Jan 01 00:00:00 IST 2018, null], 103=[Mon Jan 01 00:00:00 IST 2018, null]}
Комментарии:
1. @Deadpool, я обновил код о том, как я изначально устанавливаю даты. Я чувствую, что что-то не так со ссылкой на список дат
2. точно для каждого ключа вы сопоставляете одно и то же значение
3. @Deadpool, итак, что мне следует изменить в коде?
Ответ №1:
Проблема в том, что для каждого ключа вы соединяете один и тот же объект списка, в цикле for используйте new ArrayList(Collection<? extends E> c)
конструктор для создания нового объекта каждый раз
if (records.size() > 0) {
for (Integer record: records) {
dateMap.get(Integer.parseInt(record)); //you can remove this line
dateMap.put(record,new ArrayList(resultDate));
}
}
общедоступный список массивов (коллекция c)
Создает список, содержащий элементы указанной коллекции, в том порядке, в котором они возвращаются итератором коллекции.
Комментарии:
1. resultDate сам по себе является объектом List, поэтому вы хотите, чтобы я снова поместил новый ArrayList из списка?
2. Зачем нам нужен этот код —dateMap.get(Integer.parseInt(record));?? Вы никак не инициализируете его?
3. да, вы можете удалить ненужный код, я просто пытаюсь исправить проблему, вот и все @Syed
Ответ №2:
ваши значения могут использовать один список с псевдонимом diff
List one = new AraayList();
map.put("k1", one);
map.put("k2", one);
List alias = one;
map.put("k3", alias);
эти значения используют один и тот же экземпляр, когда вы обновляете одно, тогда другие видят изменения.