该计划如下:
// REQUIRES ES6
var rightPane = $("#right");
// Draw the right pane
rightPane.html(`
<h2>${task.task}<h2> <hr />
data1: <input type="text" id="data1" value="${task.data1}" /> <br />
data2: <input type="text" id="data2" value="${task.data2}" /> <br />
data1: <input type="text" id="data3" value="${task.data3}" /> <br />
<input type="button" id="subUpdated" value="Save">
`);
假设&#34;数据&#34;在每个级别都不是空的。 问题出现在以下步骤中。
Hash<String, HashMap<String, HashMap<String, String>>> data = new Hash<String, HashMap<String, HashMap<String, String>>>();
HashMap<String, String> person = new HashMap<String, String>();
person.put("Name", json.getString("Name"));
person.put("Contact", json.getString("Contact"));
person.put("Email", json.getString("Email"));
person.put("Rent Start", json.getString("Rent Start"));
person.put("Rent End", json.getString("Rent End"));
String period = json.getString("Rent Start").substring(0, 7) + " To " + json.getString("Rent End").substring(0, 7);
data.get(roomType).put(period, person);
当我这样做时,第二级中的hashmap中的所有值都成为人员hashmap。
例如,在&#34; roomtype1&#34;中,有2个时段,&#34; 2015-07到2016-07&#34; 和&#34; 2015-07至2017-07&#34;。
当我运行此代码时:
data.get(roomType).put(period, person);
获取的hashmap
data.get(roomtype1).put("2015-07 To 2016-07", person);
也变为data.get(roomtype1).get("2015-07 To 2017-07");
。
我可以知道为什么吗?
(p.s。原始的hashmap有5个级别。我为这篇文章减少了它,因为它更容易理解)
答案 0 :(得分:0)
Java对象是引用类型。
data.get(key1)
将获得第二级的hashmap对象。使用该对象,您将再添加一个对象。
答案 1 :(得分:0)
当我这样做时,hashmap中的所有值都在第二级 成为附加的hashmap。
data.get(roomType)
是什么?它是否做了类似的事情:
public V get(K key) {
V actual = super.get(key);
if (null == actual) {
actual = getANewV();
super.put(key, actual);
}
return actual;
}
您确定getANewV()
总是返回一个新实例而不是相同(这将解释第二级中的散列图中的所有值成为添加散列映射)。
你对Multimap的需求已经存在(见番石榴)。您可能应该看看是否适合您。 除此之外,我个人使用对象而不是多层地图。