2010-11-30 71 views
0

我有一个特定对象(会议)的列表,我需要使用字段属性(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提前。

回答

1

创建TreeSet<MonthMeeting>并添加这样所有的值:

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

现在,它的值进行排序。 MyComparator将是这样的:

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

已经实现了可比较的并将compareTo委托给GregorianCalendar对象!按照您的建议使用TreeSet!谢谢。它的工作!的xD – 2010-12-01 02:01:11

1

您不排序地图<> - 您可以排序的所有东西都是其值的集合视图,由values()方法返回。所以你的方法是正确的:实现Comparable并对集合进行排序。

+0

是的,但我需要收集元素按月/年分组。我比需要一张地图,因为每个“容器”都应该为特定的月份举行所有会议。所以最终我需要的是按照MonthMeeting对象排序的这张地图(基于它的月份/年份元素)。我已经实现了可比较的成就,现在我需要的是基于我为MonthMeeting对象实现的compareTo方法对地图进行排序。 – 2010-11-30 21:14:10

相关问题