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

У меня есть хэш-карта с ключом в качестве целого числа и значением в виде списка дат. Я пытаюсь обновить одно из значений для определенного целого числа. Первоначально даты будут одинаковыми для всех ключей.

Теперь я хочу установить одну из дат как нулевую на 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);
            }
        }

Затем обновление даты окончания как нулевого только для 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);                                        
            }
        }

Начальная дата ответа на карту

{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]}

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Проблема заключается в том, что для каждого ключа, с которым вы соединяете один и тот же объект списка, в цикле 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));
        }
    }

public ArrayList (Collection c)

Создает список, содержащий элементы указанной коллекции, в том порядке, в котором они возвращаются итератором коллекции.

0 голосов
/ 25 апреля 2019

ваши значения могут использовать один список с псевдонимом различий

List one = new AraayList();
map.put("k1", one);
map.put("k2", one);
List alias = one;
map.put("k3", alias);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...