Вам нужно Map<Year,List<DatedObject>>
, может быть, даже SortedMap
как TreeMap
.
Вы также можете использовать мультикарту из Гуавы .
По сути, вы наносите на карту каждого года (возможно, просто Integer
), List<DatedObject>
, принадлежащих этому году.
И так как годы имеют естественный порядок сортировки, вы можете посмотреть, предоставляет ли SortedMap
необходимые вам функции. Скорее всего, ответ да.
Пример карты
Вот фрагмент кода на Java, который показывает, как можно заполнить карту. Также обратите внимание, что вместо SortedMap
используется NavigableMap
; NavigableMap
разрешает запросы с включенным диапазоном (см. Связанный вопрос).
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)]}"
Смежные вопросы
Секционированный список
Если вы абсолютно настаиваете на List<List<DatedObject>> partitionedList
, то постройте карту, как указано выше, и просто следуйте ей:
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)]]"
Пример MultiMap
Вы также можете использовать Multimap
из Гуавы и Multimaps.index
служебным методом следующим образом:
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