我需要得到一个字符串[]从一个集<字符串>,但我不知道如何做到这一点。以下操作失败:
Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.
我怎样才能让它正常工作呢?
我需要得到一个字符串[]从一个集<字符串>,但我不知道如何做到这一点。以下操作失败:
Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.
我怎样才能让它正常工作呢?
当前回答
使用toArray(T[] a)方法:
String[] array = set.toArray(new String[0]);
其他回答
我也面临着同样的情况。
我首先声明我需要的结构:
设置<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方法允许将集合的元素转移到新创建的所需运行时类型的数组中。它以IntFunction<T[]>生成器作为参数,可用于:
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[]>生成器作为:
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
在Java 11中,我们可以使用Collection.toArray(生成器)方法。下面的代码将创建一个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)
使用toArray(T[] a)方法:
String[] array = set.toArray(new String[0]);