列表问题

时间:2011-06-17 20:24:44

标签: java

我是一个java新手,并且遇到了“java.util.List”的问题.Below是我的代码,我正在尝试创建一个对象列表,但我得到的结果是不受欢迎的。可以请你帮助我解决问题。

import java.util.*;

class  testMap
{
    public static void main(String[] args) 
    {


        HashMap<String,Object> childRowMap = new HashMap<String, Object>(); 
        List <Object> actList= new ArrayList <Object> ();

        for (int x=0;x<2 ;x++ ){

        if(x==0){

        childRowMap.put("startDate","startDate"+x);
        childRowMap.put("endDate","endDate"+x);
        childRowMap.put("encodedValue"," enc"+x);

        }
        else if (x==1){
        childRowMap.put("startDate","startDate"+x);
        childRowMap.put("endDate","endDate"+x);
        childRowMap.put("encodedValue"," enc"+x);
        }
        System.out.println("Adding object in the postition "+ x);
        actList.add(x,childRowMap);

        }
                System.out.println(actList);
    }
}

结果:

Adding object in the postition 0
Adding object in the postition 1
[{encodedValue= enc1, startDate=startDate1, endDate=endDate1}, {encodedValue= en
c1, startDate=startDate1, endDate=endDate1}]

===============

为什么我没有获得具有不同值的对象。通过我的代码帮助我解决问题..

6 个答案:

答案 0 :(得分:6)

您要添加childRowMap两次。

请注意,您要将参考添加到childRowMap。这意味着从索引0和索引1的引用都可以看到对地图的更改,这就是为什么它看起来像你添加了两个相同的对象。

您可以通过在循环中每次迭代创建一个新地图来修复它:

import java.util.*;

class testMap {
    public static void main(String[] args) {

.-------
|
|       List<Object> actList = new ArrayList<Object>();
|       
|       for (int x = 0; x < 2; x++) {
|           
'---------> HashMap<String, Object> childRowMap = new HashMap<String, Object>();

            if (x == 0) {
                childRowMap.put("startDate", "startDate" + x);
                childRowMap.put("endDate", "endDate" + x);
                childRowMap.put("encodedValue", " enc" + x);
            } else if (x == 1) {
                childRowMap.put("startDate", "startDate" + x);
                childRowMap.put("endDate", "endDate" + x);
                childRowMap.put("encodedValue", " enc" + x);
            }
            System.out.println("Adding object in the postition " + x);
            actList.add(x, childRowMap);

        }
        System.out.println(actList);
    }
}

<强>输出:

Adding object in the postition 0
Adding object in the postition 1
[{encodedValue= enc0, startDate=startDate0, endDate=endDate0},
 {encodedValue= enc1, startDate=startDate1, endDate=endDate1}]

答案 1 :(得分:2)

您需要在每次迭代时重新初始化地图。将初始化放在for循环中:

for(int x = 0; x < 2; x++) {
    HashMap<String,Object> childRowMap = new HashMap<String, Object>(); 
    ...
}

答案 2 :(得分:1)

问题是childRowMap是在第一行代码中创建的同一个实例。当你完成for循环时,你不是在创建一个新实例,只是在现有的HashMap中添加新值。这意味着执行参照检查的ArrayList会看到该对象已经在列表中,并且不会将其添加两次。

简单修复:在for循环中移动初始化,因此在循环的每次迭代中,HashMap都会重新实例化。

class testMap { 
    public static void main(String[] args) {
        HashMap<String,Object> childRowMap;     
        List <Object> actList= new ArrayList <Object> ();    

        for (int x=0;x<2 ;x++ ){
            childRowMap = new HashMap<String, Object>();
            if(x==0){
                childRowMap.put("startDate","startDate"+x);
                childRowMap.put("endDate","endDate"+x);
                childRowMap.put("encodedValue"," enc"+x);    
            } else if (x==1){
                childRowMap.put("startDate","startDate"+x);
                childRowMap.put("endDate","endDate"+x);
                childRowMap.put("encodedValue"," enc"+x);    
            }
            System.out.println("Adding object in the postition "+ x);
            actList.add(x,childRowMap);
        }
        System.out.println(actList);
    }
}

答案 3 :(得分:0)

您的代码中存在许多问题。它可以像这样压缩:

List <Map<String,Object>> actList= new ArrayList<Map<String,Object>> ();

for (int x=0;x<2 ;x++ ){
    Map<String,Object> childRowMap = new HashMap<String, Object>();
    childRowMap.put("startDate","startDate"+x);
    childRowMap.put("endDate","endDate"+x);
    childRowMap.put("encodedValue"," enc"+x);
    System.out.println("Adding object in the postition "+ x);
    actList.add(childRowMap);
}
System.out.println(actList);

很少有其他事情:

  • 作为Java标准,您的班级名称应以大写字母开头,因此请考虑TestMap而不是testMap
  • Map类型的变量应该是通用的Map而不是像HashMap这样的实现(我在答案中已经更正了)。
  • 考虑将List声明为更具体的类型List<Map<String,Object>>,而不是声明类型的通用对象。

答案 4 :(得分:0)

正如其他人所说,哈希映射键应该是唯一的,最简单的修复是添加这一行

HashMap<String,Object> childRowMap = new HashMap<String, Object>(); 
在for循环开始时

答案 5 :(得分:0)

按键映射存储:值对。在你的代码中

childRowMap.put("startDate","startDate"+x)

这样做:

childRowMap.put(Key,Value)

所以基本上你将关键的startDate设置为等于startDate0(当x为0时)。第二次循环时,将startDate键设置为等于startDate1(因为x为1)。现在每当你查找startDate时,它只会存储startDate1,因为startDate0被覆盖,因为你只有1个Map。

您可以通过每次循环时重新初始化地图,或者对地图中放置的每个值使用新的唯一键来解决此问题。