Разделить Java ArrayList по свойствам содержащихся объектов - PullRequest
2 голосов
/ 27 мая 2010

У меня есть ArrayList, содержащий объекты, которые имеют значение даты. Теперь я хочу создать новый ArrayList для каждого года, который содержит все объекты из основного ArrayList, которые имеют один и тот же год в качестве даты.

Таким образом, все объекты 2010 года входят в один список, а все объекты 1999 года - в другой.

Ответы [ 3 ]

12 голосов
/ 27 мая 2010

Вам нужно 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

3 голосов
/ 27 мая 2010

Метод Multimaps.index () в Гуаве сделает это за вас.

3 голосов
/ 27 мая 2010
Map<Integer, List<YourObject>> yearLists = new HashMap<Integer, List<YOurObject>>();
List<YourObject> originalList = ...; //initialized or received from somewhere

for (YourObject object : originalList) {
    int year = object.getDate().getYear(); //or something
    List<YourObject> yearList = yearLists.get(year);

    if (yearList == null) {
        yearList = new ArrayList<YourObject>();
    }

    yearList.add(object);
    yearLists.put(year, yearList);
}

Надеюсь, я не совершил там много ошибок ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...