Wie konvertiere ich eine Sammlung in eine Liste?

Lesezeit: 3 Minuten

Benutzer-Avatar
Ankur

ich benutze TreeBidiMap von dem Apache-Sammlungen Bibliothek. Ich möchte dies nach den Werten sortieren, die sind doubles.

Meine Methode besteht darin, a abzurufen Collection der Werte mit:

Collection coll = themap.values();

Was natürlich gut funktioniert.

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

Ich beabsichtige dann, über die Sortierung zu iterieren List Objekt, das sollte in Ordnung sein und die entsprechenden Schlüssel von der bekommen TreeBidiMap (themap) verwenden themap.getKey(iterator.next()) wo der Iterator über der Liste von sein wird doubles.

  • Möglicherweise möchten Sie diesen Schritt vermeiden, indem Sie direkt eine Art SortedMap verwenden, sodass die Einträge in der natürlichen Reihenfolge der verwendeten Schlüssel sind. Javas eigene TreeMap implementiert SortedMap.

    – Axel Knauf

    24. Juli 2011 um 10:41 Uhr

  • TreeBidiMap ist ein OrderedMap, die Reihenfolge sollte stimmen. Die in der Frage erforderliche Sortierung erfolgt nach Werten, nicht nach Schlüsseln.

    – Vlasec

    28. Mai 2015 um 15:01 Uhr


Benutzer-Avatar
Paul Tomblin

List list = new ArrayList(coll);
Collections.sort(list);

Wie Erel Segal Halevi unten sagt, können Sie Schritt eins überspringen, wenn coll bereits eine Liste ist. Aber das würde von den Interna von TreeBidiMap abhängen.

List list;
if (coll instanceof List)
  list = (List)coll;
else
  list = new ArrayList(coll);

  • Nur um anzumerken, dass die beiden Ansätze unterschiedliche Nebeneffekte haben: Die Sammlung in eine Liste umwandeln und dann sortieren wird auch die ursprüngliche Sammlung sortieren; Erstellen einer Kopie wird nicht.

    – Barney

    16. Dezember 2015 um 1:25 Uhr

  • Dieser Ansatz verschlechtert die Leistung erheblich, wenn er wiederholt verwendet wird. Siehe meine Antwort für eine Lösung, die spontan funktioniert, es handelt sich um eine benutzerdefinierte Sammlung.

    – Vlasec

    2. August 2016 um 11:30 Uhr


  • Dies löst nicht den Fall, wenn map.values() eine Sammlung der “inneren Klasse” zurückgibt. Der Compiler meldet, dass Collections.sort(List ) Collections.sort(List) nicht akzeptiert. Die Lösung war sogar zu verwenden: List list = map.values().stream().collect(Collectors.toList())

    – Pereira

    28. August 2018 um 4:14 Uhr

Benutzer-Avatar
Jack Leow

So etwas sollte funktionieren, das Aufrufen der ArrayList-Konstruktor das braucht eine Sammlung:

List theList = new ArrayList(coll);

Ich denke, die Antwort von Paul Tomblin kann verschwenderisch sein, falls coll bereits eine Liste ist, da sie eine neue Liste erstellt und alle Elemente kopiert. Wenn coll viele Elemente enthält, kann dies lange dauern.

Mein Vorschlag ist:

List list;
if (coll instanceof List)
  list = (List)coll;
else
  list = new ArrayList(coll);
Collections.sort(list);

Ich glaube, man kann es so schreiben:

coll.stream().collect(Collectors.toList())

Benutzer-Avatar
Aniket Sahrawat

Java 10 eingeführt List#copyOf die zurückkehrt unveränderliche Liste unter Beibehaltung der Ordnung:

List<Integer> list = List.copyOf(coll);

Collections.sort( new ArrayList( coll ) );

Benutzer-Avatar
Nathan Perrier

@Kunigami: Ich denke, Sie können sich in Bezug auf Guaven irren newArrayList Methode. Es überprüft nicht, ob das Iterable ein Listentyp ist, und gibt einfach die angegebene Liste so zurück, wie sie ist. Es stets 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());
}

  • Wie wird das nicht mehr hochgestimmt? Kunigamis Antwort ist falsch (soweit sie von der zugrunde liegenden Implementierung ausgeht).

    – GreenieMeanie

    17. April 2014 um 21:44 Uhr

1359670cookie-checkWie konvertiere ich eine Sammlung in eine Liste?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy