按包含的对象的属性拆分Java ArrayList
我有一个包含具有日期值的对象的ArrayList
。 现在我想设法为每年创建一个新的ArrayList
,其中包含主ArrayList
中具有相同年份值的所有对象。
因此,2010年的所有对象都在一个列表中,所有这些都来自1999年的另一个。
你需要Map
,甚至可能像TreeMap
一样使用SortedMap
。
您也可以使用Guava的multimap 。
基本上,您从每年(可能只是一个Integer
) List
,属于该年的List
。
由于多年来有一个自然的排序顺序,您可能想看看SortedMap
为您提供了所需的function。 很可能答案是肯定的。
地图示例
这是Java中的一个片段,向您展示如何填充地图。 另请注意,使用NavigableMap
而不是SortedMap
; 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 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> objectsByYear = new TreeMap>(); for (DatedObject obj : masterList) { List yearList = objectsByYear.get(obj.year); if (yearList == null) { objectsByYear.put(obj.year, yearList = new ArrayList ()); } 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)]}"
相关问题
- 当仅支持半开范围时,如何进行包含范围查询(ala SortedMap.subMap)
分区列表
如果你绝对坚持使用List
,那么按照上面的方式构建地图,并按照以下步骤操作: > partitionedList
List> partitionedList = new ArrayList>(objectsByYear.values()); System.out.println(partitionedList); // prints "[[C (2006)], [B (2009), E (2009)], [A (2010), D (2010)], [F (2011)]]"
MultiMap示例
您还可以使用Guava中的Multimaps.index
和Multimaps.index
实用程序方法,如下所示:
Multimap mmap = Multimaps.index( masterList, new Function(){ @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链接
-
com.google.common.collect.Multimap
-
com.google.common.collect.Multimaps
-
com.google.common.base.Function
Map> yearLists = new HashMap>(); List originalList = ...; //initialized or received from somewhere for (YourObject object : originalList) { int year = object.getDate().getYear(); //or something List yearList = yearLists.get(year); if (yearList == null) { yearList = new ArrayList (); } yearList.add(object); yearLists.put(year, yearList); }
我希望那里没有犯很多错误..
Guava中的Multimaps.index()方法将为您完成此操作。