为什么我得到错误的列表?
Why am I getting the wrong List?
我得到了一些奇怪的结果,无法解释。
你有什么想法,为什么我得到
> {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;
}
因为在每次迭代中,您都在修改相同的对象并将其添加到列表中。你可以这样做:
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);
}
当您将元素添加到 List
:
时会发生什么
l.add(rm);
您正在添加对对象的引用。
在下一次迭代中,您正在修改 rm
引用的对象,然后再次添加它。因此,您添加了两次相同的引用。
你能做什么?
一个简单的解决方案是在循环内声明 rm
:
for(int i=0; i < levelList.size(); i++){
Map<String, Object> rm = new HashMap<String, Object>();
...
}
简短版本是因为您一遍又一遍地重复使用相同的 Map
对象。
将 Map<String, Object> rm = new HashMap<String, Object>();
行移到 for
循环内,作为第一个语句,您的问题应该会消失。
从长远来看,您应该查看一些通用的 CS 或 java 教程,了解按引用传递和按值传递之间的区别。
我得到了一些奇怪的结果,无法解释。 你有什么想法,为什么我得到
> {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;
}
因为在每次迭代中,您都在修改相同的对象并将其添加到列表中。你可以这样做:
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);
}
当您将元素添加到 List
:
l.add(rm);
您正在添加对对象的引用。
在下一次迭代中,您正在修改 rm
引用的对象,然后再次添加它。因此,您添加了两次相同的引用。
你能做什么?
一个简单的解决方案是在循环内声明 rm
:
for(int i=0; i < levelList.size(); i++){
Map<String, Object> rm = new HashMap<String, Object>();
...
}
简短版本是因为您一遍又一遍地重复使用相同的 Map
对象。
将 Map<String, Object> rm = new HashMap<String, Object>();
行移到 for
循环内,作为第一个语句,您的问题应该会消失。
从长远来看,您应该查看一些通用的 CS 或 java 教程,了解按引用传递和按值传递之间的区别。