我得到一些奇怪的结果,无法解释它们。 你有一个想法,为什么我得到
> {Level=1 - Normal, Name=IT/Java}
> {Level=2 - Medium, Name=IT/Ruby}
> [{Level=2 - Medium, Name=IT/Ruby}, {Level=2 - Medium, Name=IT/Ruby}]
来自sysos的? 什么时候应该
> {Level=1 - Normal, Name=IT/Java}
> {Level=2 - Medium, Name=IT/Ruby}
> [{Level=1 - Normal, Name=IT/Java}, {Level=2 - Medium, Name=IT/Ruby}]
这是我的代码。
public List<Map<String, Object>> getMapsforTables() {
levelList = this.getSkilllevel();
description = this.getSkillnames();
Map<String, Object> rm = new HashMap<String, Object>();
List<Map<String, Object>> l = new LinkedList<Map<String, Object>>();
for(int i=0; i < levelList.size(); i++){
rm.clear();
rm.put("Name", description.get(i));
rm.put("Level", levelList.get(i));
System.out.println(rm);
l.add(rm);
}
System.out.println(l);
return l;
}
答案 0 :(得分:5)
因为在每次迭代时,您都在修改并将相同的对象添加到列表中。你可以这样做:
for(int i = 0; i < levelList.size(); i++){
Map<String, Object> rm = new HashMap<String, Object>();
rm.put("Name", description.get(i));
rm.put("Level", levelList.get(i));
System.out.println(rm);
l.add(rm);
}
答案 1 :(得分:3)
简短版本是因为您一遍又一遍地重复使用相同的Map
对象。
将Map<String, Object> rm = new HashMap<String, Object>();
行移到for
循环中,因为第一个语句和您的问题应该消失。
从长远来看,你应该看一下关于传递引用和传值的区别的一般CS或java教程。
答案 2 :(得分:2)
当您将元素添加到List
:
l.add(rm);
您正在添加对象的引用。
在下一次迭代中,您正在修改rm
引用的对象,然后再次添加它。所以,你两次添加相同的引用。
你能做什么?
一个简单的解决方案是在循环中声明rm
:
for(int i=0; i < levelList.size(); i++){
Map<String, Object> rm = new HashMap<String, Object>();
...
}