我有一个哈希图,键为整数,值作为日期列表。我正在尝试为特定整数更新值之一。最初,所有键的日期都相同。
现在,我想将日期之一设置为101键的null,当我更新特定键时,所有键的日期都将更新。我在哪里做错了?请提出建议。
这是我的代码
初始日期设置如下
// 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的更新结束日期作为null
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]}
答案 0 :(得分:2)
问题在于每个键都与同一个列表对象配对,在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));
}
}
公共ArrayList(集合c)
构造一个列表,该列表包含指定集合的元素(按集合的迭代器返回的顺序)。
答案 1 :(得分:0)
您的值可能使用一个带有diff别名的列表
List one = new AraayList();
map.put("k1", one);
map.put("k2", one);
List alias = one;
map.put("k3", alias);
这些值使用相同的实例,当您更新一个实例时,其他实例将查看更改。