2011-12-28 71 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); 
    } 
}