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?
toArray()
Methode, die im Javadoc klar erwähnt wird.toArray()
Standardmethode stackoverflow.com/a/32179686/1216775Antworten:
Verwenden Sie die
Set#toArray(T[])
Methode, um ein typisiertes Array-Argument derselben Größe zu verwenden.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 von
AbstractCollection#toArray()
.quelle
String[] GPXFILES1 = myset.toArray(new String[0]);
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.Java 11
Mit der neuen Standardmethode
toArray
in derCollection
Schnittstelle können die Elemente der Auflistung in ein neu erstelltes Array des gewünschten Laufzeittyps übertragen werden. Es nimmtIntFunction<T[]> generator
als Argument und kann verwendet werden als: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:
Wir können auch die überladene Version von toArray () verwenden, die
IntFunction<A[]> generator
wie folgt lautet :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.
quelle
stream()
verwendentoArray()
. Es kann seinset.toArray(new String[0])
set.toArray(new String[set.size()]);
Verwenden Sie die toArray (T [] a) -Methode:
quelle
[0]
sollte durch[myset.size()]
wie in der akzeptierten Antwort ersetzt werden.set.toArray(new String[0])
eine bessere Leistung hat alsset.toArray(new String[set.size()]
Guavenstil:
Weitere Informationen: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html
quelle
In Java 11 können wir die
Collection.toArray(generator)
Methode verwenden. Der folgende Code erstellt ein neues String-Array:Siehe: https://docs.oracle.com/de/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction)
quelle
quelle
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.
quelle