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