Как отсортировать карту по ее значениям, а не ключам, когда это объекты? - PullRequest
0 голосов
/ 01 декабря 2010

У меня есть список конкретных объектов (собраний), которые мне нужно сгруппировать с помощью атрибута поля (java.util.Date) и поместить их в другой объект, который является контейнером для объектов типа сгруппированных собраний, принадлежащих к тому же месяцу /year.

Итак, я думаю о некотором коде, который получает список собраний, извлеченный из базы данных, и затем группирует их по месяцам / годам в определенных объектах MonthMeetings, для этого у меня есть код, использующий карту типа:

public static Map<String, MonthMeetings> groupMeetingsByMonth(
        List<Meeting> meetings) {

    // this is by default sorted by keys I'd like to have it sorted by using
    // comparator on MonthMeetings objects, sorted by map values instead of
    // keys like SortedMap default impl.
    SortedMap<String, MonthMeetings> listMeetingsGroupedByMonth = new TreeMap<String, MonthMeetings>();

    String labelMonthYear = "";

    // reference to put in map.
    MonthMeetings monthMeetings = null;

    for (Iterator iterator = meetings.iterator(); iterator.hasNext();) {

        // grab a meeting from list
        Meeting meeting = (Meeting) iterator.next();

        // get meeting date
        Date dMeeting = meeting.getScheduledDate();

        GregorianCalendar gCalendar = new GregorianCalendar();
        gCalendar.setTime(dMeeting);

        // simple method that build label in format MM_yyyy to use as map
        // key.
        labelMonthYear = generatesLabelMonthYear(gCalendar);

        // check if MonthMeetings for specific month/year already exists in
        // Map
        monthMeetings = (MonthMeetings) listMeetingsGroupedByMonth
                .get(labelMonthYear);

        if (monthMeetings == null) {

            // if not create MonthMeetings and add first meeting to it
            monthMeetings = new MonthMeetings();
            monthMeetings.addMeeting(meeting);
            listMeetingsGroupedByMonth.put(labelMonthYear, monthMeetings);

        } else {

            // if does exist just add another meeting to it
            monthMeetings.addMeeting(meeting);

        }
    }

    return listMeetingsGroupedByMonth;
}

Этот фрагмент кода, я считаю, решает первую часть проблемы, группируя встречи по определенным объектам MonthMeetings.Теперь я с нетерпением жду, чтобы отсортировать эту карту по месяцам и месяцам.Я, вероятно, собираюсь попробовать реализовать сопоставимые объекты MonthMeetings, но тогда возник вопрос:

Как отсортировать карту по ее значениям, а не по ключам, когда это объекты?

Есть предложения?на этом?

tx заранее.

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

Создайте TreeSet<MonthMeeting> и добавьте все значения следующим образом:

TreeSet<MonthMeeting> sorted = new TreeSet<MonthMeeting>(new MyComparator());
sorted.addAll(monthMeetingMap.values());

Теперь сортируется по значениям.MyComparator будет что-то вроде:

public class MyComparator implements Comparator<MonthMeeting>() {
...
}
1 голос
/ 01 декабря 2010

Вы не сортируете карту <>. Все, что вы можете отсортировать, - это представление коллекции значений, возвращаемое методом values().Таким образом, ваш подход правильный: внедрить Comparable и отсортировать коллекцию.

0 голосов
/ 01 декабря 2010

Возможно, вы захотите взглянуть на SortedBidiMap в коллекциях Apache Commons.

...