Wie konvertiere ich Set <String> in String []?

281

Ich muss aus einem String[]herauskommen Set<String>, aber ich weiß nicht, wie ich es machen soll. Folgendes schlägt fehl:

Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.

Wie kann ich das beheben, damit es funktioniert?

suter
quelle
5
Mit der toArray()Methode, die im Javadoc klar erwähnt wird.
Marquis von Lorne
1
Java 8 Lösung: stackoverflow.com/questions/5982447/…
akhil_mittal
Java 11: Verwenden der neuen toArray()Standardmethode stackoverflow.com/a/32179686/1216775
akhil_mittal

Antworten:

461

Verwenden Sie die Set#toArray(T[])Methode, um ein typisiertes Array-Argument derselben Größe zu verwenden.

String[] GPXFILES1 = myset.toArray(new String[myset.size()]);

Es kann auch eine andere Größe verwendet werden. Dies würde die toArray()Methode jedoch dazu zwingen , ein neues Array zu erstellen, um zurückzukehren, anstatt das angegebene Argument wiederzuverwenden, was möglicherweise weniger effizient ist.

Siehe auch den Quellcode vonAbstractCollection#toArray() .

BalusC
quelle
5
Sie können auch Array der Größe 0 angeben: String[] GPXFILES1 = myset.toArray(new String[0]);
sactiw
1
@sactiw: Das wird bereits von der anderen Antwort abgedeckt. Lesen Sie den Kommentar zur anderen Antwort, warum dies nicht empfohlen wird.
BalusC
8
Ab Java 7 können wir verwenden String[] GPXFILES1 = myset.toArray(new String[0])und das wird empfohlen. Aktualisieren Sie die Antwort. "Seit den späten Aktualisierungen von OpenJDK 6 war dieser Aufruf festgelegt, wodurch die Leistung der leeren Array-Version im Vergleich zur vorgroßen Version gleich und manchmal sogar noch besser wurde. Auch das Übergeben von vorgroßen Arrays ist für eine gleichzeitige oder synchronisierte Sammlung als gefährlich Zwischen der Größe und dem toArray-Aufruf ist ein Datenwettlauf möglich, der zu zusätzlichen Nullen am Ende des Arrays führen kann, wenn die Sammlung während des Vorgangs gleichzeitig verkleinert wurde. " - Zitiert von der Java Community.
Chaitanya
6
Wenn Sie zuerst auf diese Antwort stoßen und dann mehr Nachforschungen anstellen, gibt es einige Belege dafür, dass der obige Kommentar korrekt ist. und die akzeptierte Antwort ist veraltet. Nehmen Sie diese Beispiellinks für das, was Sie wollen: stackoverflow.com/questions/9863742/… und einen Link von diesem SO-Post shipilev.net/blog/2016/arrays-wisdom-ancients .
RMSD
60

Java 11

Mit der neuen Standardmethode toArrayin der CollectionSchnittstelle können die Elemente der Auflistung in ein neu erstelltes Array des gewünschten Laufzeittyps übertragen werden. Es nimmt IntFunction<T[]> generatorals Argument und kann verwendet werden als:

 String[] array = set.toArray(String[]::new);

Es gibt bereits eine ähnliche Methode Collection.toArray(T[])und dieser Zusatz bedeutet, dass wir nicht mehr bestehen könnennull als Argument übergeben können, da in diesem Fall der Verweis auf die Methode nicht eindeutig wäre. Aber es ist immer noch in Ordnung, da beide Methoden sowieso eine NPE werfen.

Java 8

In Java 8 können wir die Streams-API verwenden:

String[] array = set.stream().toArray(String[]::new);

Wir können auch die überladene Version von toArray () verwenden, die IntFunction<A[]> generatorwie folgt lautet :

String[] array = set.stream().toArray(n -> new String[n]);

Der Zweck der Generatorfunktion besteht hier darin, eine ganze Zahl (Größe des gewünschten Arrays) zu nehmen und ein Array der gewünschten Größe zu erzeugen. Ich persönlich bevorzuge den ersteren Ansatz unter Verwendung der Methodenreferenz als den späteren unter Verwendung des Lambda-Ausdrucks.

akhil_mittal
quelle
Sie müssen nicht stream()verwenden toArray(). Es kann seinset.toArray(new String[0])
Jakub Pomykała
1
@ JakubPomykała Das ist eigentlich nicht gut. Wenn Sie ein Array mit falscher Größe angeben, muss diese Funktion intern die Reflexion verwenden, um ein Array mit der richtigen Größe zu erhalten. Wenn diese Methode benötigt wird, tun set.toArray(new String[set.size()]);
Sie
42

Verwenden Sie die toArray (T [] a) -Methode:

String[] array = set.toArray(new String[0]);
JMelnik
quelle
26
Wenn Sie ein zu kleines Array an Array () übergeben, muss die toArray () -Methode mithilfe von Reflektion ein neues Array mit der richtigen Größe erstellen. Dies hat eine erheblich schlechtere Leistung als die Übergabe eines Arrays mit mindestens der Größe der Sammlung selbst. Daher [0]sollte durch [myset.size()]wie in der akzeptierten Antwort ersetzt werden.
k2col
10
@ k2col es scheint, dass jetzt set.toArray(new String[0])eine bessere Leistung hat alsset.toArray(new String[set.size()]
Xam
1
Seit Java 7 ist dies der bevorzugte Ansatz. Siehe diesen Kommentar .
Acdcjunior
1
Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();

quelle
0

Ich war mit der gleichen Situation konfrontiert.

Ich erkläre zunächst die Strukturen, die ich brauche:

Set<String> myKeysInSet = null; String[] myArrayOfString = null;

In meinem Fall habe ich ein JSON-Objekt und ich muss alle Schlüssel in diesem JSON in einem Array von Zeichenfolgen speichern. Unter Verwendung der GSON-Bibliothek verwende ich JSON.keySet (), um die Schlüssel abzurufen und zu meinem Set zu wechseln:

myKeysInSet = json_any.keySet();

Damit habe ich eine Set-Struktur mit allen Schlüsseln, wie ich sie brauchte. Ich brauche also nur die Werte für mein Array von Strings. Siehe den folgenden Code:

myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);

Dies war meine erste Antwort in StackOverflow. Entschuldigung für jeden Fehler: D.

João Vitor Veronese Vieira
quelle