2010-11-30 8 views
0

フィールド属性(java.util.Date)を使用してグループ化し、同じ月/年に属するグループ化された会議タイプオブジェクトのコンテナである別のオブジェクトに配置する必要がある特定のオブジェクト(ミーティング)のリストがあります。マップはオブジェクトの場合、キーではなくその値に基づいてソートする方法は?

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の特定の月/年の値でソートすることを楽しみにしています。私はおそらくMonthMeetingsオブジェクトで比較を実装しようとしていますが、質問に来たより:

これらのオブジェクトがキーではなく、値に基づいてマップをソートする方法は?

これに関するご提案はありますか?

txです。

答えて

1

TreeSet<MonthMeeting>を作成し、このようなすべての値を追加します。

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

今では値でソートされます。あなたは、ApacheコモンズのコレクションにSortedBidiMapを見てすることがあります

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

compareToを呼び出してGregorianCalendarオブジェクトを比較して呼び出しを委譲しました!あなたが提案したようにTreeSetを使用しました!ありがとうございました。そしてそれは働いた! xD –

1

マップをソートしない< - ソートできるのは、values()メソッドによって返された値のコレクションビューです。だからあなたのアプローチは正しいです:実装比較し、コレクションをソートします。

+0

はい、コレクションの要素が月単位でグループ化されている必要があります。私はマップを必要とするのではなく、このコンテナのそれぞれが特定の月のすべての会議を開催する必要があるからです。ですから、私が必要とするのは、MonthMeetingオブジェクト(月/年の要素に基づいて)でソートされたマップです。私はすでにこれを実現しています。今、私が必要とするのは、私がMonthMeetingオブジェクト用に実装したcompareToメソッドに基づいてマップをソートすることです。 –

0

MyComparatorは何かのようになります。

関連する問題