【问题标题】:How to convert Set<String> to String[]?如何将 Set<String> 转换为 String[]?
【发布时间】:2011-08-24 08:34:48
【问题描述】:

我需要从Set&lt;String&gt; 中获取String[],但我不知道该怎么做。以下失败:

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

如何修复它以使其正常工作?

【问题讨论】:

标签: java


【解决方案1】:

使用Set#toArray(IntFunction&lt;T[]&gt;) 方法,将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]);

【讨论】:

    【解决方案2】:

    Java 11

    Collection 接口中新的默认 toArray 方法允许将集合的元素传输到新创建的所需运行时类型的数组中。 ItIntFunction&lt;T[]&gt; 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&lt;A[]&gt; generator 为:

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

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

    【讨论】:

    • 您不需要stream() 来使用toArray()。可以是set.toArray(new String[0])
    • @JakubPomykała 这实际上并不好。当您给出一个错误大小的数组时,该函数在内部必须使用反射来获得一个正确大小的数组。如果需要这个方法,就做set.toArray(new String[set.size()]);
    【解决方案3】:

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

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

    【讨论】:

    • 当你传递 toArray() 一个太小的数组时, toArray() 方法必须使用反射构造一个正确大小的新数组。与传递至少与集合本身大小相同的数组相比,这具有明显更差的性能。因此,[0] 应替换为[myset.size()],如已接受的答案所示。
    • @k2col 现在set.toArray(new String[0]) 的性能似乎比set.toArray(new String[set.size()] 更好
    • 从 Java 7 开始,这是首选方法。见this comment
    【解决方案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) 方法。以下代码将创建一个新的字符串数组:

      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 library,我使用 JSON.keySet() 来获取密钥并移动到我的 Set :

          myKeysInSet = json_any.keySet();

          有了这个,我有一个包含所有键的 Set 结构,这是我需要的。所以我只需要我的字符串数组的值。请看下面的代码:

          myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);

          这是我在 StackOverflow 中的第一个答案。 抱歉有任何错误:D

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-17
            • 1970-01-01
            • 1970-01-01
            • 2021-04-26
            • 2022-01-05
            • 1970-01-01
            相关资源
            最近更新 更多