我有一个ArrayList包含具有日期值的对象.现在我想设法ArrayList为每年创建一个新的,包含主日期ArrayList中具有相同年份值的所有对象.
因此,2010年的所有对象都在一个列表中,所有对象都来自1999年的另一个.
pol*_*nts 12
你需要一个Map<Year,List<DatedObject>>,甚至可能SortedMap像一个TreeMap.
您也可以使用Guava的multimap.
基本上你从每年(也许只是一年Integer)的地图,那一年的List<DatedObject>属性.
由于多年来有一个自然的排序顺序,您可能想看看是否SortedMap为您提供了所需的功能.最有可能答案是肯定的.
这是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<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)]}"
Run Code Online (Sandbox Code Playgroud)
如果你绝对坚持a 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)]]"
Run Code Online (Sandbox Code Playgroud)
您也可以使用MultimapGuava和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)]}"
Run Code Online (Sandbox Code Playgroud)
com.google.common.collect.Multimapcom.google.common.collect.Multimapscom.google.common.base.Function| 归档时间: |
|
| 查看次数: |
8446 次 |
| 最近记录: |