如何将Set <String>转换为String []?


281

我需要一个 String[]退出Set<String>,但我不知道该怎么做。以下失败:

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

我该如何修复它才能起作用?


5
使用toArray()Javadoc中明确提到的方法。
罗恩侯爵,2015年


Java 11:使用新的toArray()默认方法stackoverflow.com/a/32179686/1216775
akhil_mittal,

Answers:


461

使用采用Set#toArray(T[])相同大小的类型化数组参数的方法。

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

也可以使用其他大小,但这将迫使 toArray()方法创建一个新数组以返回而不是重新使用所提供的参数,这可能会导致效率降低。

另请参阅的源代码AbstractCollection#toArray()


5
您还可以指定大小为0的数组:String[] GPXFILES1 = myset.toArray(new String[0]);
sactiw

1
@sactiw:另一个答案已经解决了。阅读关于其他答案的评论,为什么不建议这样做。
BalusC

8
从Java 7开始,我们可以使用String[] GPXFILES1 = myset.toArray(new String[0])并且建议这样做。更新答案。“自从OpenJDK 6的最新更新以来,这个调用就变得很有趣,与空大小版本相比,空数组版本的性能相同,有时甚至更好。传递空大小的数组对于并发或同步收集很危险,因为如果在操作过程中同时缩小了集合,则在size和toArray调用之间可能发生数据争用,这可能导致数组末尾出现额外的null。” -由Java社区引用。
Chaitanya

6
首先遇到这个答案,然后再做更多的研究,有一些证据支持上述评论是正确的。并且接受的答案已过期。将这些示例链接用于您将要做的事情:stackoverflow.com/questions/9863742/…以及该SO中的链接发布shipilev.net/blog/2016/arrays-wisdom-ancients
RMSD

60

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]);

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


您不需要stream()使用toArray()。可能是set.toArray(new String[0])
JakubPomykała17年

1
@JakubPomykała其实不好。当您提供错误大小的数组时,在内部该函数必须使用反射来获取正确大小的数组。如果需要这种方法,set.toArray(new String[set.size()]);
那就

42

使用 toArray(T [] a)方法:

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

26
当您将toArray()的尺寸过小的数组传递给toArray()方法时,必须使用反射来构造一个尺寸正确的新数组。与传递至少具有集合本身大小的数组相比,此方法的性能要差得多。因此[0]应替换[myset.size()]为已接受的答案中的。
k2col '16

10
@ k2col看来现在set.toArray(new String[0])的性能要比set.toArray(new String[set.size()]
Xam

1
从Java 7开始,这是首选方法。看到这个评论
acdcjunior



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

0

我面临着同样的情况。

首先,我声明所需的结构:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.