【问题标题】:Convert Character array to string in Java在Java中将字符数组转换为字符串
【发布时间】:2012-10-20 11:36:33
【问题描述】:

我有一个 Character 数组(不是 char 数组),我想通过组合数组中的所有字符将其转换为字符串。

对于给定的Character[] a,我尝试了以下操作:

String s = new String(a) //given that a is a Character array

但这不起作用,因为 a 不是 char 数组。我将不胜感激。

【问题讨论】:

  • 以上正在处理 char[] :)

标签: java string char


【解决方案1】:
Character[] a = ...
new String(ArrayUtils.toPrimitive(a));

ArrayUtilsApache Commons Lang 的一部分。

【讨论】:

  • +1 表示我不知道的课程,我不明白为什么JDK中没有这样的课程:-/
  • 它没有做任何特别的事情。它只是创建一个相同长度的 char[] 并添加 char 值。非常基本的代码。 JDK 的工作是专注于语言核心并解决不那么简单的常见问题。一个开源的实用程序库是一个合适的地方。
  • 此解决方案不应包含此库,但我的经验是,无论如何我总是已经将它包含在其他内容中!
  • -1 表示“我不明白为什么 JDK 中没有这样的类” - 如果在新版本中添加每个可以想象的实用程序类,JDK 将会崩溃。
【解决方案2】:

最有效的方法很可能是这样的:

Character[] chars = ...

StringBuilder sb = new StringBuilder(chars.length);
for (Character c : chars)
    sb.append(c.charValue());

String str = sb.toString();

注意事项:

  1. 使用 StringBuilder 可以避免创建多个中间字符串。
  2. 提供初始大小可避免重新分配。
  3. 使用charValue() 避免调用Character.toString() ...

但是,除非性能是一个重大问题,否则我可能会选择 @Torious 的优雅答案。


顺便说一句,JLS 表示允许编译器使用等效的 StringBuilder 代码优化字符串连接表达式......但它不批准跨多个语句的优化。因此是这样的:

    String s = ""
    for (Character c : chars) {
        s += c;
    }

可能会进行大量单独的连接,创建(并丢弃)大量中间字符串。

【讨论】:

    【解决方案3】:

    迭代和连接方法:

    Character[] chars = {new Character('a'),new Character('b'),new Character('c')};
    
    StringBuilder builder = new StringBuilder();
    
    for (Character c : chars)
        builder.append(c);
    
    System.out.println(builder.toString());
    

    输出:

    abc

    【讨论】:

    • 我会检查这个编译到一个 StringBuilder,对于相当大的n ..我认为这几天会发生。
    • 因此,对于 N 长度的数组,你最终会在内存中得到 N 个字符串
    • @pst - 我很确定 JLS 不会批准跨多个语句的字符串连接优化。
    • 在其他 cmets 中提到,应该使用 StringBuilder,而不是像这样的循环中的字符串连接。
    • @EdJ 谢谢。我已经相应地编辑了答案。
    【解决方案4】:

    先将Character[]转换成char[],再用String.valueOf(char[])得到String如下:

        char[] a1 = new char[a.length];
        for(int i=0; i<a.length; i++) {
            a1[i] = a[i].charValue();
        }
        String text = String.valueOf(a1);
        System.out.println(text);
    

    【讨论】:

      【解决方案5】:

      这可能很慢,但对于踢球来说,这是一个与其他方法不同的丑陋的单线 -

      Arrays.toString(characterArray).replaceAll(", ", "").substring(1, characterArray.length + 1);
      

      【讨论】:

        【解决方案6】:

        可能有点矫枉过正,但在 Java 8 上你可以这样做:

        Character[] chars = {new Character('a'),new Character('b'),new Character('c')};
        
        String value = Arrays.stream(chars)
                        .map(Object::toString)
                        .collect( Collectors.joining() );
        

        【讨论】:

        • Arrays.asList(chars).stream()可以简化为Arrays.stream(chars)
        • 对于大数组(>10000 个元素),使用 \n char[] chars2 = new char[chars.length]; IntStream.range(0, chars.length).forEach(i -&gt; chars2[i] = chars[i]); String str = new String(chars); 会有更好的性能
        • 这种方法的时间复杂度是多少?
        【解决方案7】:

        在每个索引处,调用 toString 方法,并将结果连接到您的 String s。

        【讨论】:

          【解决方案8】:

          如何创建自己的方法来遍历字符数组列表,然后将每个值附加到新字符串。

          类似的东西。

          public String convertToString(Character[] s) {
             String value;
          
             if (s == null) {
               return null;
             }
          
             Int length = s.length();
             for (int i = 0; i < length; i++) {
               value += s[i];
             }
          
             return value;
          } 
          

          【讨论】:

          • 在调用length() 之后,您正在检查s 是否为空。
          • 应该注意到,起初我的目标是对其进行一些优化,以便为其他人提供良好的示例练习。 :)
          • IMO,null 检查是错误的。默认情况下,null 参数是由于程序员的错误,最好的处理方法是抛出 NPE。
          【解决方案9】:

          实际上,如果你有 Guava,你可以使用 Chars.toArray() 生成 char[] 然后将结果发送到 String.valueOf()

          【讨论】:

            【解决方案10】:
            int length = cArray.length;
            String val="";
            for (int i = 0; i < length; i++)
                val += cArray[i];
            System.out.println("String:\t"+val);
            

            【讨论】:

              猜你喜欢
              • 2023-03-19
              • 2012-04-17
              • 1970-01-01
              • 1970-01-01
              • 2011-02-16
              • 2016-06-03
              • 1970-01-01
              相关资源
              最近更新 更多