Ich benutze diesen Code, um a Set
in a umzuwandeln List
:
Map<String, List<String>> mainMap = new HashMap<>();
for (int i=0; i < something.size(); i++) {
Set<String> set = getSet(...); //returns different result each time
List<String> listOfNames = new ArrayList<>(set);
mainMap.put(differentKeyName, listOfNames);
}
Ich möchte vermeiden, in jeder Iteration der Schleife eine neue Liste zu erstellen. Ist das möglich?
java
performance
list
set
Muhammad Imran Tariq
quelle
quelle
Antworten:
Sie können die List.addAll () -Methode verwenden. Es akzeptiert eine Sammlung als Argument, und Ihr Satz ist eine Sammlung.
BEARBEITEN: als Antwort auf die Bearbeitung der Frage.
Es ist leicht zu erkennen, dass Sie k verschiedene Listen erstellen müssen , wenn Sie a
Map
mitList
s als Werte haben möchten , um k verschiedene Werte zu haben.Also: Sie können das Erstellen dieser Listen überhaupt nicht vermeiden, die Listen müssen erstellt werden.
Mögliche
Umgehung : Deklarieren Sie Ihre
Map
alsMap<String,Set>
oder oderMap<String,Collection>
fügen Sie einfach Ihr Set ein.quelle
differentKeyName
ändert sich jede Iteration? Möchten Sie tatsächlichsomething.size()
verschiedene mögliche Werte in Ihren Karten? Es ist leicht zu erkennen, dass eine Karte mitk
Listen als Werten mindestensk
Listen erstellen muss .Verwenden Sie den Konstruktor, um es zu konvertieren:
quelle
Auch aus der Guava Collect-Bibliothek können Sie Folgendes verwenden
newArrayList(Collection)
:Dies wäre der vorherigen Antwort von amit sehr ähnlich , außer dass Sie kein
list
Objekt deklarieren (oder instanziieren) müssen .quelle
ArrayList
Konstruktor dennoch auf .new ArrayList<>([your_set])
.In Java 8 können wir folgenden Liner verwenden:
Hier ist ein kleines Beispiel:
quelle
Ich wollte einen sehr schnellen Weg, um mein Set in List umzuwandeln und zurückzugeben, also tat ich es in einer Zeile
quelle
Sie könnten diese einzeilige Änderung verwenden:
Arrays.asList(set.toArray(new Object[set.size()]))
quelle
Ich würde tun:
quelle
Da dies bisher noch nicht erwähnt wurde, können Sie ab Java 10 die neue
copyOf
Factory-Methode verwenden:Aus dem Javadoc :
quelle
Java 8 bietet die Möglichkeit, Streams zu verwenden, und Sie können eine Liste erhalten von
Set<String> setString
:Die interne Implementierung bietet jedoch ab sofort eine Instanz von
ArrayList
:JDK garantiert dies jedoch nicht. Wie hier erwähnt :
Wenn Sie immer sicher sein möchten, können Sie eine Instanz speziell anfordern als:
quelle
Ich erstelle eine einfache
static
Methode:... oder wenn Sie den Listentyp festlegen möchten, können Sie Folgendes verwenden:
quelle
Kürzlich habe ich folgendes gefunden:
quelle
public static <T> ArrayList<T> list(Enumeration<T> e) { ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; }
Der Vollständigkeit halber...
Angenommen, Sie möchten die Werte wirklich
Map
alsList
s behandeln, aber Sie möchten vermeiden, sie jedes MalSet
in ein zu kopierenList
.Zum Beispiel rufen Sie vielleicht eine Bibliotheksfunktion auf, die eine erstellt
Set
, aber Sie übergeben IhrMap<String, List<String>>
Ergebnis an eine (schlecht gestaltete, aber nicht in Ihren Händen befindliche) Bibliotheksfunktion, die nur benötigt wirdMap<String, List<String>>
, obwohl Sie irgendwie wissen, dass die Operationen, die sie mit der ausführtList
s gelten gleichermaßen für alleCollection
(und damit alleSet
). Und aus irgendeinem Grund Sie den Geschwindigkeits- / Speicheraufwand beim Kopieren jedes Sets in eine Liste vermeiden.In diesem Super-Nischen-Fall können Sie abhängig vom (möglicherweise nicht erkennbaren) Verhalten, das die Bibliotheksfunktion von Ihrem
List
s benötigt, möglicherweise eineList
Ansicht über jedes Set erstellen . Beachten Sie, dass dies von Natur aus unsicher ist (da sich die Anforderungen der BibliotheksfunktionList
vermutlich ändern können, ohne dass Sie es wissen). Daher sollte eine andere Lösung bevorzugt werden. Aber so würden Sie es machen.Sie würden eine Klasse erstellen, die die
List
Schnittstelle implementiert , einSet
im Konstruktor übernimmt und dieses Set einem Feld zuweist und dieses interne dann verwendet,Set
um dieList
API zu implementieren (soweit möglich und gewünscht).Beachten Sie, dass einige Listenverhaltensweisen Sie einfach nicht imitieren können, ohne die Elemente als zu speichern
List
, und einige Verhaltensweisen, die Sie nur teilweise imitieren können. Auch diese Klasse istList
im Allgemeinen kein sicherer Ersatz für s. Insbesondere wenn Sie wissen, dass der Anwendungsfall indexbezogene Operationen oder MUTATING the erfordertList
, würde dieser Ansatz sehr schnell nach Süden gehen.quelle
Ich fand das gut und nützlich, um eine Liste aus einem Set zu erstellen.
quelle
quelle