it-swarm.com.de

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

Ich muss einen String[] aus einem Set<String> herausholen, weiß aber nicht, wie ich das 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 es reparieren, damit es funktioniert?

249
suter

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

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

Es kann auch eine andere Größe verwendet werden, dies würde jedoch die toArray()-Methode dazu zwingen, ein neues Array zu erstellen, anstatt das bereitgestellte Argument erneut zu verwenden, was möglicherweise weniger effizient ist. 

Siehe auch den Quellcode von AbstractCollection#toArray() .

433
BalusC

Java 11

Mit der neuen Standardmethode toArray in der Schnittstelle Collection können die Elemente der Auflistung in ein neu erstelltes Array des gewünschten Laufzeittyps übertragen werden. Es nimmt IntFunction<T[]> generator als 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 null nicht mehr übergeben können, da der Verweis auf die Methode mehrdeutig wäre. Aber es ist immer noch in Ordnung, da beide Methoden sowieso eine NPE werfen.

Java 8

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

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

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

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 früheren Ansatz mit Methodenreferenz als den späteren mit Lambda-Ausdruck.

50
i_am_zero

Verwenden Sie toArray (T [] a) Methode:

String[] array = set.toArray(new String[0]);
36
JMelnik

Guave-Stil:

Set<String> myset = myMap.keySet();
FluentIterable.from(mySet).toArray(String.class);

weitere Informationen: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html

5
user7708
Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();
1
user10763303

In Java 11 können wir die Collection.toArray(generator)-Methode verwenden. Mit dem folgenden Code wird ein neues Array von String erstellt:

Set<String> set = Set.of("one", "two", "three");
String[] array = set.toArray(String[]::new)

Siehe: https://docs.Oracle.com/de/Java/javase/11/docs/api/Java.base/Java/util/Collection.html#toArray(Java.util.function.IntFunction)

1
Rafal Borowiec

Ich war mit der gleichen Situation konfrontiert.

Ich beginne damit, die Strukturen zu deklarieren, die ich brauche:

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

In meinem Fall habe ich ein JSON-Objekt und ich brauche alle Schlüssel in diesem JSON, um in einem Array von Zeichenfolgen gespeichert zu werden. Mit der GSON-Bibliothek benutze 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 Tasten, wie ich es brauchte. Also brauche ich nur die Werte für mein Array of Strings. Siehe den Code unten:

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

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