【问题标题】:Convert from a list of characters "List<Character>" to an array of chars "char[]"从字符列表“List<Character>”转换为字符数组“char[]”
【发布时间】:2021-02-07 09:23:08
【问题描述】:

Java 中有什么方法可以将List&lt;Character&gt; list 转换为字符数组char[] chars

我想要这个,以便以后我可以使用String(chars) 创建一个String。 我们有使用Stream 的快捷方式吗?

我看到我们可以从List&lt;Integer&gt;(或DoubleLong)转换为int[](或double[]long[]),但类似的功能不适用于char,因为我们没有 IntStream 的等效字符?

请建议我们是否有快速的方法。

我当前的代码是:

new String(getCharArray(charList))
private static char[] getCharArray(List<Character> charList) {
    char[] charArray = new char[charList.size()];
    for (int i = 0; i < charArray.length; i++) {
        charArray[i] = charList.get(i);
    }
    return charArray;
}

【问题讨论】:

    标签: java list java-8 char java-stream


    【解决方案1】:

    TL;DR

    你可以这样做(例如):

    list.stream().map(Object::toString).collect(Collectors.joining()).toCharArray();

    但是,如果您想将其作为 String 直接使用:

    list.stream().map(Object::toString).collect(Collectors.joining());
    

    详细解答

    我看到我们可以从 List (...) 转换,但类似的功能不是 可用于 char,因为我们没有 IntStream 的等效字符?

    是的,因为您可以结合使用内置方法 mapToInttoArray 来获得免费的转换。这同样不适用于char 类型。尽管如此,您仍然可以使用通用的map,转换为String,然后再转换为字符数组:

      list.stream().map(Object::toString).collect(Collectors.joining()).toCharArray();
    

    我想要这个,以便稍后我可以使用 String(chars) 创建一个字符串。 我们有使用 Stream 的捷径吗?

    那为什么不直接做呢?!:

    String collect = list.stream()
                         .map(String::valueOf)
                         .collect(Collectors.joining());
    

    运行示例:

    public static void main(String[] args) {
        List<Character> list = List.of('H', 'e','l','l','o');
        String collect = list.stream().map(String::valueOf).collect(Collectors.joining());
        System.out.println(collect);
    }
    

    输出

    Hello
    

    【讨论】:

      【解决方案2】:

      转换每个 Character 到一个 String 非常慢
      所以是这样的

      int[] tmp = list.stream().mapToInt( c -> c ).toArray();
      

      只转换为String 一次

      String rslt = new String( tmp, 0, tmp.length );
      

      如果你也需要char[]

      char[] array = rslt.toCharArray();
      

      (有人需要一个List&lt;Character&gt;为了什么?)

      【讨论】:

        【解决方案3】:
        private static char[]  getCharArray(List<Character> charList) {
            return charList.stream()
                .map(String::valueOf)
                .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
                .toString()
                .toCharArray();
          }
        

        请注意这是在构造一个String,它在Java 内部由一个char[] 支持。来自toCharArray()的文档

        将此字符串转换为新的字符数组。

        返回:一个新的 分配的字符数组,其长度是这个字符串的长度 并且其内容被初始化为包含字符序列 由这个字符串表示。

        因此,这将在内部创建两个 char[](一个用于支持字符串),toCharArray 返回一个具有相同内容的新数组。

        【讨论】:

        • .map(String::valueOf) 步骤已过时。而且由于 OP 说“我想要这个,以便稍后我可以创建一个字符串”,这个解决方案可以通过省略 toCharArray() 并已经拥有 String 来提高效率。
        【解决方案4】:

        您可以在没有 Streams 的情况下做到这一点。查看类List的方法toArray(T[] a)。它完全符合您的要求。您需要做的就是:

        Character[] charArray = charList.toArray(new Character[charList.size()]);
        

        【讨论】:

        • 你能试着编译一下吗? Character[]char[] 不同。
        • 只是一个简单的错字。改变答案。但是该方法仍然是正确的使用方法
        • 这是一个顽固的神话,将charList.size() 传递给数组有助于提高性能。事实上,charList.toArray(new Character[0]) 的效率更高。有兴趣了解详情的可以阅读shipilev.net/blog/2016/arrays-wisdom-ancients
        • @Holger 我不明白为什么有人会有List&lt;Character&gt;。想法?
        • @AniketSahrawat 你得问提问者。
        【解决方案5】:

        没有特殊的Stream方法可以将List&lt;Character&gt;转换为基元数组char[],但您可以自己使用IntStream,例如:

        List<Character> list = List.of('a', 'b', 'c');
        
        char[] chars = new char[list.size()];
        
        IntStream.range(0, list.size()).forEach(i -> chars[i] = list.get(i));
        
        System.out.println(Arrays.toString(chars)); // [a, b, c]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多