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

tzi*_*ppy 2 java arraylist

我有一个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)

MultiMap示例

您也可以使用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)

API链接