Цикл итератора, пока он не пуст - PullRequest
1 голос
/ 29 декабря 2011

Я хочу получить все объекты из списка и поместить их в 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 ]

3 голосов
/ 29 декабря 2011
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 голос
/ 29 декабря 2011

Нечто подобное должно делать эту работу.Я не скомпилировал его.

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);
}
...