Как преобразовать Set <String> в String []?

Мне нужно получить 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]);

Цель функции генератора здесь состоит в том, чтобы взять целое число (размер желаемого массива) и создать массив желаемого размера. Я лично предпочитаю первый подход, использующий ссылку на метод, чем более поздний, использующий лямбда-выражение.

Ответ 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