Обновление хэш-карты для всех ключей, если значение обновляется для определенного ключа

#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);
  

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