Die einfachste Art, ein Set umzuwandeln zu einer Liste

Lesezeit: 6 Minuten

Benutzer-Avatar
Jacques Rene Mesrine

Ich mache z.B. gerade folgendes:

Set<String> setOfTopicAuthors = ....

List<String> list = Arrays.asList( 
    setOfTopicAuthors.toArray( new String[0] ) );

Kannst du das schlagen?

  • Verwenden java.util.Collection: O(0)

    – Tim

    23. Februar 2010 um 15:56 Uhr

  • @Carl, ich muss das Set an eine Schnittstelle eines Drittanbieters senden, für die eine Liste erforderlich ist. @Tim Ich wünschte, ich könnte die Schnittstelle des Drittanbieters ändern, um Collection zu verwenden.

    – Jacques René Mesrine

    24. Februar 2010 um 2:08 Uhr

  • Aha; Abgesehen von seltsamen Einschränkungen würde ich Rogers Antwort folgen. Wenn Sie die Liste jedoch nicht erneut verwenden, würde ich die Zuweisung zu irgendetwas überspringen (dh verwenden Sie foo.api (new ArrayList (listOfTopicAuthors)) anstelle von foo.api (list)).

    – Carl

    24. Februar 2010 um 15:26 Uhr

  • @JacquesRenéMesrine: Die erste fragliche Codezeile ist irreführend: Erwartet: Set<String> setOfTopicAuthors = .... Tatsächlich: Set<String> listOfTopicAuthors = ....

    – realPK

    18. Februar 2017 um 20:24 Uhr


  • Oder ein alternativer Weg, dasselbe zu tun, könnte sein List<String> list = Arrays.asList(setOfTopicAuthors.toArray(String[]::new))detailliert in der verlinkten Antwort.

    – Namann

    26. Juli 2018 um 19:02 Uhr


List<String> list = new ArrayList<String>(listOfTopicAuthors);

  • … und sich damit radikal den Java-Code-Konventionen widersetzt: oracle.com/technetwork/java/javase/documentation/… ! 🙂 🙂

    – Håvard Geithus

    1. Februar 2014 um 0:49 Uhr

  • Danach, als ich versuchte, auf das Listenelement zuzugreifen, gab es den Fehler “java.lang.ClassCastException: java.lang.Integer kann nicht in java.lang.String umgewandelt werden” … weiß nicht warum … es ist einfach list.get (int) das ist es … irgendwelche Vorschläge?

    – Code

    20. Juni 2014 um 17:45 Uhr

  • Ich glaube, in Java 7 und höher können Sie den Typparameter weglassen ArrayList nachgeben: List<String> l = new ArrayList<>(listOfTopicAuthors); Am prägnantesten ohne Verwendung einer externen Bibliothek?

    – Brett Duncavage

    30. Oktober 2014 um 19:37 Uhr


  • In diesem Fall wird eine NullPointerException ausgelöst listOfTopicAuthors ist Null.

    – w35l3y

    30. August 2016 um 20:33 Uhr

List<String> l = new ArrayList<String>(listOfTopicAuthors);

  • für das Antworten in derselben Minute wie die akzeptierte Antwort und das Nichterhalten des Credentials. +1

    – jayeffkay

    4. Dezember 2015 um 12:10 Uhr

  • @Adamski Am Ende habe ich eine Liste, deren Index bei 1 statt bei 0 beginnt, gibt es Abhilfe?

    – Jack

    18. Februar 2016 um 22:49 Uhr


  • @Jack: Das wird definitiv nicht der Fall sein. Aus dem Javadoc von java.util.List: “Listen (wie Java-Arrays) sind nullbasiert.”

    – Adamsky

    19. Februar 2016 um 14:55 Uhr

  • @Adamski Danke für die Antwort. Ich weiß, dass Listen nullbasiert sein sollten und sind, weshalb das für mich so seltsam ist. Nachdem ich meinen Satz in eine Liste konvertiert habe, kann ich keine iterativen Operationen für jeden ausführen, sortieren usw. Ich erhalte eine NullPointerException, aber wenn ich erwarte, dass meine Liste keines der Elemente null ist, und das einzige Seltsame, das ich bemerke, ist, dass die Index beginnt bei 1. Wenn ich jedoch nur eine normale Liste erstelle, beginnt der Index bei 0. Seltsam?

    – Jack

    19. Februar 2016 um 15:04 Uhr


  • @Jack: Das klingt sehr seltsam. Wenn Sie Ihren Code als separate Frage posten, kann Ihnen sicher jemand helfen.

    – Adamsky

    22. Februar 2016 um 8:54 Uhr

Benutzer-Avatar
akhil_mittal

Wenn man bedenkt, dass wir haben Set<String> stringSet wir können folgendes verwenden:

Einfaches Java

List<String> strList = new ArrayList<>(stringSet);

Guave

List<String> strList = Lists.newArrayList(stringSet);

Apache Commons

List<String> strList = new ArrayList<>();
CollectionUtils.addAll(strList, stringSet);

Java 10 (nicht änderbare Liste)

List<String> strList = List.copyOf(stringSet);
List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

Java 8 (Änderbare Listen)

import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());

Gemäß der Dok für die Methode toList()

Es gibt keine Garantien für Typ, Veränderbarkeit, Serialisierbarkeit oder Thread-Sicherheit der zurückgegebenen Liste; Wenn mehr Kontrolle über die zurückgegebene Liste erforderlich ist, verwenden Sie toCollection(Supplier).

Wenn wir also eine bestimmte Implementierung benötigen, z ArrayList wir können es so bekommen:

List<String> stringList2 = stringSet.stream().
                              collect(toCollection(ArrayList::new));

Java 8 (nicht änderbare Listen)

können wir nutzen Collections::unmodifiableList -Methode und umbrechen Sie die Liste, die in den vorherigen Beispielen zurückgegeben wurde. Wir können auch unsere eigene benutzerdefinierte Methode schreiben als:

class ImmutableCollector {
    public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
            return Collector.of( supplier, List::add, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }, Collections::unmodifiableList);
        }
}

Und dann verwenden Sie es als:

List<String> stringList3 = stringSet.stream()
             .collect(ImmutableCollector.toImmutableList(ArrayList::new)); 

Eine weitere Möglichkeit ist die Nutzung collectingAndThen Methode, mit der eine letzte Transformation durchgeführt werden kann, bevor das Ergebnis zurückgegeben wird:

    List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
      toCollection(ArrayList::new),Collections::unmodifiableList));

Einer Punkt zu beachten ist das die methode Collections::unmodifiableList gibt eine unveränderbare Ansicht der angegebenen Liste zurück, wie per Dok. Eine nicht modifizierbare Ansichtssammlung ist eine Sammlung, die nicht änderbar ist und auch eine Ansicht auf eine Hintergrundsammlung darstellt. Beachten Sie, dass Änderungen an der Sicherungssammlung möglicherweise noch möglich sind und dass sie, wenn sie auftreten, in der nicht änderbaren Ansicht sichtbar sind. Sondern die Kollektormethode Collectors.unmodifiableList gibt eine wirklich unveränderliche Liste in zurück Java 10.

  • Ich habe dies verwendet, um a zu konvertieren Set<Double> zu einem List<Doublewoher der Satz kam a LinkedHashMap‘s .keySet() Methode. Eclipse teilte mir mit, dass es einen Typkonflikt gab und ich nicht konvertieren konnte Object zu List<Double>. Können Sie mir sagen, warum das passiert sein könnte? Ich habe es durch Casting umgangen, aber ich habe mich gefragt, warum es passiert.

    – Ungeheuer

    4. Januar 2016 um 2:09 Uhr


  • Ja, da Java-Entwickler immer mehr Java 8-Funktionen verwenden sollten, ist diese Antwort besser als die beiden obigen Antworten.

    – Shubham Pandey

    2. Oktober 2017 um 7:28 Uhr

Benutzer-Avatar
Prabhakar Manthena

Versuchen Sie dies für Satz:

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors); 

Versuchen Sie dies für Karte:

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());

Wenn Sie Guava verwenden, importieren Sie statisch newArrayList Methode aus Listen Klasse:

List<String> l = newArrayList(setOfAuthors);

Benutzer-Avatar
jp093121

nicht wirklich sicher, was Sie genau über den Kontext Ihres Codes tun, aber …

warum machen die listOfTopicAuthors überhaupt variabel?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

das “….” stellt dar, wie auch immer Ihr Set ins Spiel kam, egal ob es neu ist oder von einem anderen Ort stammt.

1354660cookie-checkDie einfachste Art, ein Set umzuwandeln zu einer Liste

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

Privacy policy