当这些是对象时,如何根据它的值而不是键来对地图进行排序?

时间:2010-11-30 21:01:51

标签: java sorting collections map

我有一个特定对象(会议)的列表,我需要使用字段属性(java.util.Date)对它们进行分组,并将它们放在另一个对象中,该对象是属于同一个月的分组会议类型对象的容器/年。

所以我正在考虑一些代码,这些代码接收从数据库中提取的会议列表,然后按月/年在特定的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特定的月/年值对此地图进行排序。我可能会尝试在MonthMeetings对象上实现可比较的,但问题是:

如果这些是对象,如何根据它的值而不是键对地图进行排序?

对此有何建议?

提前tx。

3 个答案:

答案 0 :(得分:1)

您没有对地图&lt;&gt;进行排序 - 您可以排序的是它的值的Collection视图,由values()方法返回。所以你的方法是正确的:实现Comparable并对集合进行排序。

答案 1 :(得分:1)

创建TreeSet<MonthMeeting>并添加所有值,如下所示:

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

现在它按值排序。 MyComparator将类似于:

public class MyComparator implements Comparator<MonthMeeting>() {
...
}

答案 2 :(得分:0)

您可能需要查看apache commons集合中的SortedBidiMap