2 Stimmen

Java ArrayList nach Eigenschaften der enthaltenen Objekte aufteilen

Ich habe eine ArrayList mit Objekten, die einen Datumswert haben. Jetzt möchte ich ein neues ArrayList für jedes Jahr, das alle Objekte aus der Hauptliste enthält ArrayList die das gleiche Jahr in ihrem Datum haben Wert.

Alle Objekte aus dem Jahr 2010 kommen also in eine Liste, alle aus dem Jahr 1999 in eine andere.

14voto

polygenelubricants Punkte 362173

Sie brauchen eine Map<Year,List<DatedObject>> vielleicht sogar SortedMap wie ein TreeMap .

Sie können auch Folgendes verwenden multimap von Guava .

Im Wesentlichen kartieren Sie von jedem Jahr (vielleicht nur eine Integer ), die List<DatedObject> die in dieses Jahr gehören.

Und da Jahre eine natürliche Sortierreihenfolge haben, sollten Sie prüfen, ob SortedMap bietet Ihnen die Funktionalitäten, die Sie brauchen. Höchstwahrscheinlich lautet die Antwort: Ja.


Das Kartenbeispiel

Das folgende Java-Snippet zeigt Ihnen, wie Sie die Karte auffüllen können. Beachten Sie auch, dass NavigableMap verwendet wird, statt SortedMap ; NavigableMap erlaubt Bereichsabfragen (siehe verwandte Frage).

    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)]}"

Verwandte Fragen


Die unterteilte Liste

Wenn Sie unbedingt auf eine List<List<DatedObject>> partitionedList , erstellen Sie dann die Karte wie oben beschrieben, und folgen Sie ihr einfach:

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)]]"

Das MultiMap-Beispiel

Sie können auch Folgendes verwenden Multimap aus Guave, und Multimaps.index Versorgungsmethode wie folgt:

    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-Links

4voto

fish Punkte 1051
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);
}

Ich hoffe, ich habe dort nicht viele Fehler gemacht

4voto

Kevin Bourrillion Punkte 39545

En Multimaps.index() Methode in Guava wird dies für Sie tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X