Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的名单错了?_Java_List_Hashmap_System.out - Fatal编程技术网

Java 为什么我的名单错了?

Java 为什么我的名单错了?,java,list,hashmap,system.out,Java,List,Hashmap,System.out,我得到了一些奇怪的结果,无法解释。 你知道为什么我会 > {Level=1 - Normal, Name=IT/Java} > {Level=2 - Medium, Name=IT/Ruby} > [{Level=2 - Medium, Name=IT/Ruby}, {Level=2 - Medium, Name=IT/Ruby}] 来自系统? 应该是什么时候 > {Level=1 - Normal, Name=IT/Java} > {Level=2 - Me

我得到了一些奇怪的结果,无法解释。 你知道为什么我会

> {Level=1 - Normal, Name=IT/Java} 
> {Level=2 - Medium, Name=IT/Ruby}
> [{Level=2 - Medium, Name=IT/Ruby}, {Level=2 - Medium, Name=IT/Ruby}]
来自系统? 应该是什么时候

> {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;
    }
public List getMapsforTables(){
levelList=this.getSkilllevel();
description=this.getSkillnames();
Map rm=newhashmap();
列表l=新的LinkedList();
对于(int i=0;i
因为在每次迭代中,您都在修改相同的对象并将其添加到列表中。你可以做:

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);
}
for(int i=0;i
当您将元素添加到
列表中时,会发生以下情况:

l.add(rm);
您正在添加对对象的引用

在下一次迭代中,您将修改
rm
引用的对象,然后再次添加它。因此,您添加了两次相同的引用

你能做什么?

一个简单的解决方案是在循环内声明
rm

for(int i=0; i < levelList.size(); i++){
    Map<String, Object> rm = new HashMap<String, Object>();
    ...
}
for(int i=0;i
短版本是因为您反复使用同一个
贴图
对象

移动
Map rm=newhashmap()行在
for
循环中,作为第一条语句,您的问题应该消失


从长远来看,您应该看一些关于按引用传递和按值传递之间区别的通用CS或java教程。

请了解对象和引用是什么-您不断更改一个对象,同时已经将其放置在另一个对象中,并怀疑之后会有什么变化。