348 Stimmen

Wie konvertiert man eine Sammlung in eine Liste?

Ich verwende TreeBidiMap von der Apache-Sammlungen Bibliothek. Ich möchte diese nach den Werten sortieren, die doubles .

Meine Methode ist das Abrufen einer Collection der Werte verwenden:

Collection coll = themap.values();

Das funktioniert natürlich gut.

Hauptfrage: Ich möchte nun wissen, wie ich konvertieren/casten kann (nicht sicher, was richtig ist) coll in eine List damit sie sortiert werden kann?

Ich beabsichtige dann, über die sortierten Daten zu iterieren List Objekt, das in Ordnung sein sollte, und holen Sie die entsprechenden Schlüssel aus dem TreeBidiMap ( themap ) mit themap.getKey(iterator.next()) wobei der Iterator über die Liste der doubles .

10voto

OscarRyz Punkte 189898
Collections.sort( new ArrayList( coll ) );

5voto

hbamithkumara Punkte 1798

Java 8 aufwärts...

Sie können Collection in jede beliebige Collection (d.h. List, Set und Queue) konvertieren, indem Sie Ströme y Collectors.toCollection() .

Betrachten Sie die folgende Beispielkarte

Map<Integer, Double> map = Map.of(
    1, 1015.45,
    2, 8956.31,
    3, 1234.86,
    4, 2348.26,
    5, 7351.03
);

zu ArrayList

List<Double> arrayList = map.values()
                            .stream()
                            .collect(
                                Collectors.toCollection(ArrayList::new)
                            );

Ausgabe: [7351.03, 2348.26, 1234.86, 8956.31, 1015.45]

in sortierte ArrayListe (aufsteigende Reihenfolge)

List<Double> arrayListSortedAsc = map.values()
                                        .stream()
                                        .sorted()
                                        .collect(
                                            Collectors.toCollection(ArrayList::new)
                                        );

Ausgabe: [1015.45, 1234.86, 2348.26, 7351.03, 8956.31]

zu Sortierte ArrayListe (absteigende Reihenfolge)

List<Double> arrayListSortedDesc = map.values()
                                        .stream()
                                        .sorted(
                                            (a, b) -> b.compareTo(a)
                                        )
                                        .collect(
                                            Collectors.toCollection(ArrayList::new)
                                        );

Ausgabe: [8956.31, 7351.03, 2348.26, 1234.86, 1015.45]

zu LinkedList

List<Double> linkedList = map.values()
                                .stream()
                                .collect(
                                    Collectors.toCollection(LinkedList::new)
                                );

Ausgabe: [7351.03, 2348.26, 1234.86, 8956.31, 1015.45]

zu HashSet

Set<Double> hashSet = map.values()
                            .stream()
                            .collect(
                                Collectors.toCollection(HashSet::new)
                            );

Ausgabe: [2348.26, 8956.31, 1015.45, 1234.86, 7351.03]

zu PriorityQueue

PriorityQueue<Double> priorityQueue = map.values()
                                            .stream()
                                            .collect(
                                                Collectors.toCollection(PriorityQueue::new)
                                            );

Ausgabe: [1015.45, 1234.86, 2348.26, 8956.31, 7351.03]

Referenz

Java - Paket java.util.stream

Java - Paket java.util

4voto

Nathan Perrier Punkte 514

@Kunigami: Ich glaube, du irrst dich in Bezug auf Guavas newArrayList Methode. Sie prüft nicht, ob die Iterable ein List-Typ ist, und gibt die gegebene List einfach unverändert zurück. Sie immer erstellt eine neue Liste:

@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
  checkNotNull(elements); // for GWT
  // Let ArrayList's sizing logic work, if possible
  return (elements instanceof Collection)
      ? new ArrayList<E>(Collections2.cast(elements))
      : newArrayList(elements.iterator());
}

1voto

Vlasec Punkte 5291

Die von Ihnen geforderte Operation ist ziemlich kostspielig, stellen Sie sicher, dass Sie sie nicht oft durchführen müssen (z. B. in einem Zyklus).

Wenn Sie sie sortiert halten und häufig aktualisieren möchten, können Sie eine benutzerdefinierte Sammlung erstellen. Ich habe zum Beispiel eine erstellt, die Ihre TreeBidiMap y TreeMultiset unter der Haube. Implementieren Sie nur das, was Sie brauchen, und achten Sie auf die Datenintegrität.

class MyCustomCollection implements Map<K, V> {
    TreeBidiMap<K, V> map;
    TreeMultiset<V> multiset;
    public V put(K key, V value) {
        removeValue(map.put(key, value));
        multiset.add(value);
    }
    public boolean remove(K key) {
        removeValue(map.remove(key));
    }
    /** removes value that was removed/replaced in map */
    private removeValue(V value) {
        if (value != null) {
            multiset.remove(value);
        }
    }
    public Set<K> keySet() {
        return Collections.unmodifiableSet(map.keySet());
    }
    public Collection<V> values() {
        return Collections.unmodifiableCollection(multiset);
    }
    // many more methods to be implemented, e.g. count, isEmpty etc.
    // but these are fairly simple
}

Auf diese Weise haben Sie eine sortiert Multiset zurückgegeben von values() . Wenn es sich jedoch um eine Liste handeln soll (z. B. wenn Sie die Array-ähnliche get(index) Methode), bräuchten Sie etwas Komplexeres.

Der Kürze halber gebe ich nur unveränderbare Sammlungen zurück. Was @Lino erwähnt hat, ist richtig, und das Ändern der keySet o values Sammlung in ihrer jetzigen Form wäre inkonsequent. Ich kenne keinen konsistenten Weg, um die values veränderlich, aber die keySet könnte unterstützen remove wenn es die remove Methode aus dem MyCustomCollection Klasse oben.

1voto

Gary Gregory Punkte 409

Ströme verwenden:

someCollection.stream().collect(Collectors.toList())

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