循环迭代器直到它为空

时间:2011-12-28 23:46:40

标签: java iterator

我想从列表中获取所有对象并将它们放入按创建日期分组的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;
}

但这是错误的,它只会获得与第一个元素具有相同日期的所有元素,因此我的地图最终只有一个元素。

我真的不知道如何解决这个问题......

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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);
}