按包含的对象的属性拆分Java ArrayList

我有一个包含具有日期值的对象的ArrayList 。 现在我想设法为每年创建一个新的ArrayList ,其中包含主ArrayList中具有相同年份值的所有对象。

因此,2010年的所有对象都在一个列表中,所有这些都来自1999年的另一个。

你需要Map> ,甚至可能像TreeMap一样使用SortedMap

您也可以使用Guava的multimap 。

基本上,您从每年(可能只是一个IntegerList ,属于该年的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.indexMultimaps.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()方法将为您完成此操作。