Мне нужно выйти String[]
из Set<String>
, но я не знаю, как это сделать. Следующие ошибки:
Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.
Как я могу это исправить, чтобы он работал?
toArray()
метода, который четко упоминается в Javadoc.toArray()
метода по умолчанию stackoverflow.com/a/32179686/1216775Ответы:
Используйте
Set#toArray(T[])
метод, принимающий аргумент типизированного массива того же размера.Также можно использовать другой размер, но это заставит
toArray()
метод создать новый массив для возврата вместо повторного использования предоставленного аргумента, который может оказаться менее эффективным.Смотрите также исходный код
AbstractCollection#toArray()
.источник
String[] GPXFILES1 = myset.toArray(new String[0]);
String[] GPXFILES1 = myset.toArray(new String[0])
и это рекомендуется. Обновите ответ. «После поздних обновлений OpenJDK 6 этот вызов был встроен, что делало производительность пустой версии массива такой же, а иногда даже лучшей, по сравнению с версией с предварительным размером. Также передача массива с предварительно заданным размером опасна для одновременного или синхронизированного сбора, так как между вызовом size и toArray возможна гонка данных, что может привести к дополнительным нулям в конце массива, если коллекция одновременно сокращалась во время операции. " - цитируется сообществом Java.Java 11
Новый
toArray
метод по умолчанию вCollection
интерфейсе позволяет передавать элементы коллекции во вновь созданный массив требуемого типа времени выполнения. Он принимает вIntFunction<T[]> generator
качестве аргумента и может использоваться как:Подобный метод уже существует,
Collection.toArray(T[])
и это добавление означает, что мы больше не можем передавать его вnull
качестве аргумента, поскольку в этом случае ссылка на метод будет неоднозначной. Но это все еще хорошо, так как оба метода бросают NPE в любом случае.Java 8
В Java 8 мы можем использовать потоковый API:
Мы также можем использовать перегруженную версию toArray (), которая принимает
IntFunction<A[]> generator
:Цель функции генератора здесь состоит в том, чтобы взять целое число (размер желаемого массива) и создать массив желаемого размера. Я лично предпочитаю первый подход, использующий ссылку на метод, чем более поздний, использующий лямбда-выражение.
источник
stream()
использоватьtoArray()
. Это может бытьset.toArray(new String[0])
set.toArray(new String[set.size()]);
Используйте метод toArray (T [] a) :
источник
[0]
следует заменить[myset.size()]
как в принятом ответе.set.toArray(new String[0])
имеет лучшую производительность, чемset.toArray(new String[set.size()]
Стиль гуавы:
дополнительная информация: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html.
источник
В Java 11 мы можем использовать
Collection.toArray(generator)
метод. Следующий код создаст новый массив String:См .: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction).
источник
источник
Я столкнулся с той же ситуацией.
Я начинаю с объявления структур, которые мне нужны:
Set<String> myKeysInSet = null; String[] myArrayOfString = null;
В моем случае у меня есть объект JSON, и мне нужно, чтобы все ключи в этом JSON были сохранены в массиве строк. Используя библиотеку GSON , я использую JSON.keySet (), чтобы получить ключи и перейти к своему набору:
myKeysInSet = json_any.keySet();
При этом у меня есть структура Set со всеми ключами, как мне было нужно. Поэтому мне просто нужны значения для моего массива строк. Смотрите код ниже:
myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);
Это был мой первый ответ в StackOverflow. Извините за любую ошибку: D
источник