2010-11-30 3 views
0

Ich habe eine Liste von spezifischen Objekten (Besprechungen), die ich unter Verwendung eines Feldattributs (java.util.Date) gruppieren und in ein anderes Objekt einfügen muss, das ein Container für gruppierte Besprechungsobjekte ist, die zum selben Monat/Jahr gehören .Wie sortiere ich eine Karte anhand ihrer Werte, nicht der Schlüssel, wenn es sich um Objekte handelt?

So über einig Code Ich denke, das ein Treffen Liste geholt aus der Datenbank und als Gruppe sie von Monat/Jahr in bestimmten MonthMeetings Objekten, für diesen Ich habe einen Code mit einer Karte wie erhält:

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; 
} 

Dieser Codeabschnitt löst, glaube ich, den ersten Teil des Problems und gruppiert Meetings mit seinen spezifischen MonthMeetings-Objekten. Jetzt freue ich mich darauf, diese Map nach Monat/Jahr-Werten zu sortieren. Ich werde wahrscheinlich versuchen, vergleichbare auf MonthMeetings Objekte zu implementieren, aber dann kam die Frage:

Wie sortiert man eine Karte basierend auf ihren Werten, nicht Schlüssel, wenn diese Objekte sind?

Irgendwelche Vorschläge dazu?

Tx im Voraus.

Antwort

1

eine TreeSet<MonthMeeting> erstellen und alle Werte wie folgt hinzu:

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

es nun auf Werte sortiert. MyComparator wird so etwas wie:

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

Vergleichbar implementiert und den Aufruf von compareTo an GregorianCalendar-Objekte delegiert! Dann haben Sie ein TreeSet verwendet, wie Sie es vorgeschlagen haben! Danke. Und es hat funktioniert! xD –

1

Sie sortieren keine Karte <> - Alles, was Sie sortieren können, ist eine Sammlungsansicht seiner Werte, wie von der values()-Methode zurückgegeben. Ihre Vorgehensweise ist also korrekt: Implementieren Sie Comparable und sortieren Sie die Sammlung.

+0

Ja, aber ich brauche die Sammlungselemente nach Monat/Jahr gruppiert. Ich brauche dann keine Karte, da jeder "Container" alle Meetings für einen bestimmten Monat abhalten sollte. Am Ende benötige ich diese Map, die nach Monat/Jahr-Objekten sortiert ist (basierend auf ihren Monat/Jahr-Elementen). Ich habe bereits vergleichbare implementiert, um das zu erreichen, was ich jetzt brauche, ist das Sortieren der Map basierend auf compareTo-Methode, die ich für MonthMeeting-Objekte implementiert habe. –

0

Sie vielleicht einen Blick auf SortedBidiMap in Apache Commons Sammlungen nehmen wollen.

Verwandte Themen