Muszę się String[]
z tego wydostać Set<String>
, ale nie wiem, jak to zrobić. Następujące niepowodzenie:
Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.
Jak mogę to naprawić, aby działało?
toArray()
metodzie wyraźnie wymienionej w Javadoc.toArray()
domyślnej metody stackoverflow.com/a/32179686/1216775Odpowiedzi:
Skorzystaj z
Set#toArray(T[])
metody biorąc argument tablicowy o tej samej wielkości.Można również użyć innego rozmiaru, ale zmusiłoby to
toArray()
metodę do utworzenia nowej tablicy do powrotu zamiast ponownego użycia dostarczonego argumentu, co może okazać się mniej wydajne.Zobacz także kod źródłowy
AbstractCollection#toArray()
.źródło
String[] GPXFILES1 = myset.toArray(new String[0]);
String[] GPXFILES1 = myset.toArray(new String[0])
i jest to zalecane. Zaktualizuj odpowiedź. „Od czasu późnych aktualizacji OpenJDK 6 to wywołanie było nieodwracalne, dzięki czemu wydajność pustej tablicy jest taka sama, a czasem nawet lepsza w porównaniu z wersją o wcześniejszych rozmiarach. Również przekazywanie tablic o wcześniejszych rozmiarach jest niebezpieczne dla zbierania równoległego lub zsynchronizowanego, ponieważ możliwy jest wyścig danych między rozmową size a wywołaniem toArray, co może skutkować dodatkowymi wartościami null na końcu tablicy, jeśli kolekcja zostanie jednocześnie zmniejszona podczas operacji. ” - cytowane przez społeczność Java.Java 11
Nowa domyślna
toArray
metodaCollection
interfejsu umożliwia przeniesienie elementów kolekcji do nowo utworzonej tablicy żądanego typu środowiska wykonawczego. To bierzeIntFunction<T[]> generator
jako argument i mogą być wykorzystane jako:Istnieje już podobna metoda
Collection.toArray(T[])
i to dodanie oznacza, że nie będziemy już mogli przekazać jejnull
jako argumentu, ponieważ w takim przypadku odwołanie do metody byłoby niejednoznaczne. Ale nadal jest w porządku, ponieważ obie metody i tak rzucają NPE.Java 8
W Javie 8 możemy używać API strumieni:
Możemy również skorzystać z przeciążonej wersji toArray (), która przyjmuje
IntFunction<A[]> generator
jako:Celem funkcji generatora jest tutaj przyjęcie liczby całkowitej (rozmiar pożądanej tablicy) i utworzenie tablicy o pożądanym rozmiarze. Osobiście wolę pierwsze podejście z wykorzystaniem metody referencyjnej niż późniejsze z wykorzystaniem wyrażenia lambda.
źródło
stream()
używaćtoArray()
. Może byćset.toArray(new String[0])
set.toArray(new String[set.size()]);
Użyj metody toArray (T [] a) :
źródło
[0]
należy go zastąpić[myset.size()]
jak w przyjętej odpowiedzi.set.toArray(new String[0])
ma lepszy występ niżset.toArray(new String[set.size()]
Styl guawy:
więcej informacji: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html
źródło
W Javie 11 możemy użyć
Collection.toArray(generator)
metody. Poniższy kod utworzy nową tablicę String:Zobacz: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction)
źródło
źródło
Miałem taką samą sytuację.
Zaczynam od zadeklarowania potrzebnych struktur:
Set<String> myKeysInSet = null; String[] myArrayOfString = null;
W moim przypadku mam obiekt JSON i potrzebuję wszystkich kluczy w tym JSON do przechowywania w tablicy ciągów. Korzystając z biblioteki GSON , używam JSON.keySet (), aby uzyskać klucze i przejść do mojego zestawu:
myKeysInSet = json_any.keySet();
Dzięki temu mam strukturę Set ze wszystkimi kluczami, tak jak potrzebowałem. Potrzebuję tylko wartości do mojej tablicy ciągów. Zobacz poniższy kod:
myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);
To była moja pierwsza odpowiedź w StackOverflow. Przepraszamy za jakikolwiek błąd: D
źródło