如何转换Set<String>String[]吗?

我需要从Set<String>中获得String[],但我不知道如何做到这一点。以下操作失败:

Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.

我怎样才能让它正常工作呢?

297448 次浏览

使用Set#toArray(IntFunction<T[]>)方法,将IntFunction作为生成器。

String[] GPXFILES1 = myset.toArray(String[]::new);

如果你还没有使用Java 11,那么使用Set#toArray(T[])方法接受相同大小的类型化数组参数。

String[] GPXFILES1 = myset.toArray(new String[myset.size()]);

虽然仍然不在Java 11上,并且不能保证myset在转换为数组时不可修改,但最好指定一个空类型数组。

String[] GPXFILES1 = myset.toArray(new String[0]);

使用toArray (T [])方法:

String[] array = set.toArray(new String[0]);

Java 11

Collection接口中新的默认toArray方法允许将集合的元素转移到新创建的所需运行时类型的数组中。IntFunction<T[]> generator作为参数,可用于:

 String[] array = set.toArray(String[]::new);

已经有一个类似的方法Collection.toArray(T[]),这个添加意味着我们不能再将null作为参数传递,因为在这种情况下,对该方法的引用将是模糊的。但这仍然是可以的,因为这两种方法都会抛出NPE。

Java 8

在Java 8中,我们可以使用streams API:

String[] array = set.stream().toArray(String[]::new);

我们还可以使用toArray ()的重载版本,它将IntFunction<A[]> generator作为:

String[] array = set.stream().toArray(n -> new String[n]);

这里generator函数的目的是获取一个整数(所需数组的大小)并生成所需大小的数组。我个人更喜欢使用方法引用的前一种方法,而不是使用lambda表达式的后一种方法。

番石榴风格:

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

我也面临着同样的情况。

我首先声明我需要的结构:

< p > <代码> 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

在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)

Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();