ArrayList作为HashMap的值仅返回ArrayList的最后一个元素

时间:2014-03-21 11:01:51

标签: java iterator hashmap

请参阅以下代码 -

Map<DateTime, ArrayList<ElementInformationBean>> mapTithi = new HashMap<DateTime, ArrayList<ElementInformationBean>>();
List<ElementInformationBean> lstTime = null;
ElementInformationBean curntTithi = null;
ElementInformationBean nextTithi = null;
for (int i = 0; i < lstNakstra.size()-1; i++) {
    lstTime = new ArrayList<ElementInformationBean>();
    curntTithi = lstNakstra.get(i);
    nextTithi = lstNakstra.get(i+1);
    if(curntTithi.getStartTime().toDateMidnight().equals(nextTithi.getStartTime().toDateMidnight()))
        {
        lstTime.add(curntTithi);
        lstTime.add(nextTithi);
        mapTithi.put(curntTithi.getStartTime().toDateMidnight().toDateTime(), (ArrayList<ElementInformationBean>) lstTime);
    } else {
        lstTime.add(curntTithi);
                mapTithi.put(curntTithi.getStartTime().toDateMidnight().toDateTime(), (ArrayList<ElementInformationBean>) lstTime);
    }
}

用于打印

for (Map.Entry<DateTime, ArrayList<PanchangaElementInformationBean>> entry : mapTithi.entrySet()) {
    DateTime key = entry.getKey();
    ArrayList<PanchangaElementInformationBean> values = entry.getValue();
    System.out.println("Key = " + key);
    for (PanchangaElementInformationBean p: values) {
        System.out.print("Values = " + p.getStartTime() + "n");
    }    
}

我正在尝试使用HashMap;键为dateTime,值为List。但是,当我迭代并打印该值时,它总会返回。

由于 Kumar Shorav

3 个答案:

答案 0 :(得分:2)

在循环外初始化lstTime

试试这段代码:

Map<DateTime, ArrayList<ElementInformationBean>> mapTithi = new HashMap<DateTime, ArrayList<ElementInformationBean>>();

// Intialize here
List<ElementInformationBean> lstTime = new ArrayList<ElementInformationBean>(); 

ElementInformationBean curntTithi = null;
ElementInformationBean nextTithi = null;
for (int i = 0; i < lstNakstra.size()-1; i++) {
    curntTithi = lstNakstra.get(i);
    nextTithi = lstNakstra.get(i+1);
    if(curntTithi.getStartTime().toDateMidnight().equals(nextTithi.getStartTime().toDateMidnight()))
        {
        lstTime.add(curntTithi);
        lstTime.add(nextTithi);
        mapTithi.put(curntTithi.getStartTime().toDateMidnight().toDateTime(), (ArrayList<ElementInformationBean>) lstTime);
    } else {
        lstTime.add(curntTithi);
                mapTithi.put(curntTithi.getStartTime().toDateMidnight().toDateTime(), (ArrayList<ElementInformationBean>) lstTime);
    }
}

答案 1 :(得分:1)

Getters班级的SettersPanchangaElementInformationBean上,将数据类型从Date更改为ArrayList<Date>,并将setStartTime添加为吼叫,这样你就可以从中得到所有的价值。

    private ArrayList<Date> startTime;

    public ArrayList<Date> getStartTime() {
         return startTime;
    }

    public void setStartTime(Date item) {
        if (startTime == null) {
            startTime = new ArrayList<Date>();
        }
     this.startTime.add(item);
  }

因此,在迭代时,您可以从ArrayList

获取所有值

并在主打印for loop上添加此内容以打印来自Date的个人ArrayList

    for (Date startTime : p.getStartTime()) {
        System.out.println(startTime);
    }

并在For循环上方初始化lstTime = new ArrayList<ElementInformationBean>();,以便您可以添加许多元素,否则它只会将一个循环实例值重复添加到列表中。

答案 2 :(得分:0)

如果要在用作地图值的列表中累积元素,则必须使用此方法:

 List<...> list = map.get( key );
 if( null == list ) {
     list = new ...;
     map.put( key, list );
 }

 list.add( ... );