Java 如何基于它对地图进行排序';s值,而不是键,当它们是对象时?

Java 如何基于它对地图进行排序';s值,而不是键,当它们是对象时?,java,sorting,collections,map,Java,Sorting,Collections,Map,我有一个特定对象(会议)的列表,我需要使用字段属性(java.util.Date)对这些对象进行分组,并将它们放在另一个对象中,该对象是属于同一个月/年的分组会议类型对象的容器 因此,我正在考虑一些代码,这些代码接收从数据库获取的会议列表,然后在特定MonthMeetings对象中按月/年对它们进行分组,为此,我有一个使用以下映射的代码: public static Map<String, MonthMeetings> groupMeetingsByMonth( Li

我有一个特定对象(会议)的列表,我需要使用字段属性(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;
}
publicstaticmap-groupMeetingsByMonth(
(会议名单){
//默认情况下,这是按键排序的。我希望使用
//MonthMeetings对象上的比较器,按地图值排序,而不是
//如SortedMap default impl之类的键。
SortedMap listMeetingsGroupedByMonth=新建树映射();
字符串labelMonthYear=“”;
//参考放在地图上。
MonthMeetings MonthMeetings=null;
for(Iterator Iterator=meetings.Iterator();Iterator.hasNext();){
//从列表中抓取一个会议
会议=(会议)迭代器.next();
//获取会议日期
Date dMeeting=meeting.getScheduledDate();
GregorianCalendar gCalendar=新的GregorianCalendar();
gCalendar.设定时间(dMeeting);
//以MM_yyyy格式构建标签以用作地图的简单方法
//钥匙。
labelMonthYear=生成labelMonthYear(gCalendar);
//检查中是否已存在特定月份/年份的月会议
//地图
monthMeetings=(monthMeetings)列表会议按月份分组
.get(labelMonthYear);
if(monthMeetings==null){
//如果没有,则创建月会议并将第一次会议添加到其中
monthMeetings=新的monthMeetings();
月会议。增加会议(会议);
listMeetingsGroupedByMonth.put(labelMonthYear,monthMeetings);
}否则{
//如果确实存在,只需添加另一个会议即可
月会议。增加会议(会议);
}
}
返回列表会议按月份分组;
}
我相信,这段代码解决了问题的第一部分,即根据特定的MonthMeetings对象对会议进行分组。现在,我期待着按月会议的具体月/年值对该地图进行排序。我可能会尝试在MonthMeetings对象上实现comparable,但接下来的问题是:

当地图是对象时,如何基于其值而不是键对其进行排序

有什么建议吗

提前发送。

您不需要对映射进行排序-您只能对其值的集合视图进行排序,该视图由
values()
方法返回。因此,您的方法是正确的:实现可比较并对集合进行排序。

创建一个
树集
,并添加以下所有值:

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

您可能想看看apache commons集合中的元素。

是的,但我需要按月/年分组的集合元素。我需要一张地图,因为每个“容器”都应该在一个月内召开所有会议。所以最后我需要的是这个地图,它是按MonthMeeting对象排序的(基于它的月/年元素)。我已经实现了comparable,现在我需要的是基于compareTo方法对地图进行排序,我已经为MonthMeeting对象实现了comparable,并将对compareTo的调用委托给GregorianCalendar对象!而不是像你建议的那样用树丛!非常感谢。成功了!除息的
public class MyComparator implements Comparator<MonthMeeting>() {
...
}