我尝试重复使用相同的HashMap,如下例所示填充列表。首先,我在地图中添加了一些值,将地图添加到列表中,然后清除地图,以便再次添加新值并在列表中添加第二组值,等等......
但是,似乎clear()方法还删除了先前在列表中添加的值,如果我不使用clear()方法,则先前在列表中添加的每组值都会被新的值集覆盖,因此在这个特定的例子中,我将在列表中有4个相同的值集。
我做错了什么?
List<HashMap<String, String>>dataList = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map = new HashMap<String, String>();
map.put(Answer.ID, "0");
map.put(Answer.IMAGE, "color_icon_awesome");
map.put(Answer.TITLE, firstOption);
dataList.add(map);
map.clear();
map.put(Answer.ID, "1");
map.put(Answer.IMAGE, "color_icon_awesome");
map.put(Answer.TITLE, secondOption);
dataList.add(map);
map.clear();
map.put(Answer.ID, "2");
map.put(Answer.IMAGE, "color_icon_awesome");
map.put(Answer.TITLE, thirdOption);
dataList.add(map);
map.clear();
map.put(Answer.ID, "3");
map.put(Answer.IMAGE, "color_icon_awesome");
map.put(Answer.TITLE, fourthOption);
dataList.add(map);
map.clear();
答案 0 :(得分:11)
dataList.add(map)
会在列表中引用map
,因此它不是副本。然后,当您再执行map.clear()
时,它也会删除列表中地图的内容,因为它是完全相同的对象。之后做dataList.add(map.clone())
或(最好)做map = new HashMap<>();
。
map.put(Answer.ID, "0");
map.put(Answer.IMAGE, "color_icon_awesome");
map.put(Answer.TITLE, firstOption);
dataList.add(map);
map = new HashMap<>();
旁注:您的代码看起来像是可以使用对象而不是地图:
class AnswerObject {
private String id;
private String image;
private String title;
public AnswerObject(String id, String image, String title) {
this.id = id;
this.image = image;
this.title = title;
}
// some getters and setters and some other usefull code
}
这应该使您的代码更好,更易读
List<AnswerObject> dataList = new ArrayList<>();
dataList.add(new AnswerObject("0", "color_icon_awesome", firstOption));
dataList.add(new AnswerObject("1", "color_icon_awesome", secondOption));
dataList.add(new AnswerObject("2", "color_icon_awesome", thirdOption));
dataList.add(new AnswerObject("3", "color_icon_awesome", fourthOption));
但可以随意忽略; - )
答案 1 :(得分:1)
您要将相同的地图添加到列表中。您是否想要获得来自地图或地图列表的字符串列表?如果您想要一个地图列表,那么每次都需要创建一个新地图。将地图放入列表并修改地图内容后,您将修改添加到列表中的相同地图。只需在添加方法中更改代码,而不是dataList.add(map);
执行dataList.add(new HashMap(map));
这将解决您的问题