Sie brauchen eine Map<Year,List<DatedObject>>
vielleicht sogar SortedMap
wie ein TreeMap
.
Sie können auch Folgendes verwenden multimap von Guava .
Im Wesentlichen kartieren Sie von jedem Jahr (vielleicht nur eine Integer
), die List<DatedObject>
die in dieses Jahr gehören.
Und da Jahre eine natürliche Sortierreihenfolge haben, sollten Sie prüfen, ob SortedMap
bietet Ihnen die Funktionalitäten, die Sie brauchen. Höchstwahrscheinlich lautet die Antwort: Ja.
Das Kartenbeispiel
Das folgende Java-Snippet zeigt Ihnen, wie Sie die Karte auffüllen können. Beachten Sie auch, dass NavigableMap
verwendet wird, statt SortedMap
; NavigableMap
erlaubt Bereichsabfragen (siehe verwandte Frage).
class DatedObject {
final String name; final int year;
DatedObject(String name, int year) {
this.name = name; this.year = year;
}
@Override public String toString() {
return String.format("%s (%d)", name, year);
}
}
List<DatedObject> masterList = Arrays.asList(
new DatedObject("A", 2010),
new DatedObject("B", 2009),
new DatedObject("C", 2006),
new DatedObject("D", 2010),
new DatedObject("E", 2009),
new DatedObject("F", 2011)
);
NavigableMap<Integer,List<DatedObject>> objectsByYear =
new TreeMap<Integer,List<DatedObject>>();
for (DatedObject obj : masterList) {
List<DatedObject> yearList = objectsByYear.get(obj.year);
if (yearList == null) {
objectsByYear.put(obj.year, yearList = new ArrayList<DatedObject>());
}
yearList.add(obj);
}
System.out.println(objectsByYear);
// prints "{2006=[C (2006)], 2009=[B (2009), E (2009)],
// 2010=[A (2010), D (2010)], 2011=[F (2011)]}"
System.out.println(objectsByYear.get(2011));
// prints "[F (2011)]"
System.out.println(objectsByYear.subMap(2007, true, 2010, true));
// prints "{2009=[B (2009), E (2009)], 2010=[A (2010), D (2010)]}"
Verwandte Fragen
Die unterteilte Liste
Wenn Sie unbedingt auf eine List<List<DatedObject>> partitionedList
, erstellen Sie dann die Karte wie oben beschrieben, und folgen Sie ihr einfach:
List<List<DatedObject>> partitionedList =
new ArrayList<List<DatedObject>>(objectsByYear.values());
System.out.println(partitionedList);
// prints "[[C (2006)], [B (2009), E (2009)], [A (2010), D (2010)], [F (2011)]]"
Das MultiMap-Beispiel
Sie können auch Folgendes verwenden Multimap
aus Guave, und Multimaps.index
Versorgungsmethode wie folgt:
Multimap<Integer,DatedObject> mmap = Multimaps.index(
masterList,
new Function<DatedObject, Integer>(){
@Override public Integer apply(DatedObject from) {
return from.year;
}
}
);
System.out.println(mmap);
// prints "{2010=[A (2010), D (2010)], 2009=[B (2009), E (2009)],
// 2006=[C (2006)], 2011=[F (2011)]}"
API-Links