2011-12-28 83 views
1

我想从列表中获取所有对象,并将它们放入按创建日期分组的Map,这意味着映射如下所示:Map<String, List<MyObject>>MyObject对象具有存储其创建日期的字段。循环迭代器直到它为空

我想过做一个嵌套的while循环,如下所示:

public Map<String, List<Expense>> getExpensesSorted(SortType type){ 
    Map<String, List<Expense>> map = new HashMap<String, List<Expense>>(); 

    List<Expense> expenses = getAllExpenses(budgetId).getExpenses() 
      .getList(); 

    if (type.equals(SortType.DAY)) { 
     Iterator<Expense> expIter = expenses.iterator(); 

     while (expIter.hasNext()) { 
      List<Expense> list = new ArrayList<Expense>(); 
      Expense exp = (Expense) expIter.next(); 
      list.add(exp); 

      String day = exp.getDate().format("YYYY-MM-DD"); 
      expIter.remove(); 

      while (expIter.hasNext()) { 
       Expense exp2 = (Expense) expIter.next(); 
       if (exp2.getDate().format("YYYY-MM-DD").equals(day)) { 
        list.add(exp2); 
        expIter.remove(); 
       } 
      } 
      map.put(day, expenses); 
     } 

    } else if (type.equals(SortType.WEEK)) { 
     ... 
    } else if (type.equals(SortType.TYPE)) { 
     ... 
    } else if (type.equals(SortType.CATEGORY)) { 
     ... 
    } 
    return map; 
} 

但这是错误的,它只是变得一切都在同一天的第一个元素的,所以我的地图最终只有一个元素。

我严重不知道如何解决这个问题?

预先感谢任何帮助。

回答

1

像这样的东西应该做的工作。我没有编译它。

while (iter.hasNext()) { 
    MyObject obj = (MyObject) iter.next(); 
    String day = obj.getDate().format("YYYY-MM-DD"); 

    if(!map.containsKey(day)) { 
     map.put(day, new ArrayList<MyObject>()); 
    } 
    List<MyObject> list = map.get(day); 
    list.add(obj); 
    map.put(day, list); 
} 
+0

这是我犯的一个错误,这是同样的'Iterator' – 2011-12-29 00:07:24

+0

编辑答案 – suat 2011-12-29 00:15:35

+0

首先,我得到的列表中给出的关键,但不删除旧加入新的值更新列表然后覆盖与密钥相对应的前一个列表。不好吗? – suat 2011-12-29 00:23:48

3
Map<Data, List<MyObject>> result = new HashMap<Data, List<MyObject>>; 
for (List<MyObject> list : myMap.values()) { 
    for (MyObject myObject : list) { 
     Date date = myObject.getDate(); 
     List<MyObject> newList = result.get(date); 
     if (newList == null) { 
      newList = new Arraylist<MyObject>; 
      result.put(date. newList); 
     } 
     newList.add(myObject); 
    } 
}