【问题标题】:Convert array of strings into a string in Java在Java中将字符串数组转换为字符串
【发布时间】:2023-03-19 10:51:01
【问题描述】:

我想要将字符串数组转换为字符串的 Java 代码。

【问题讨论】:

  • 什么样的数组?字符串数组?
  • array.toString() ?更具体。
  • @Princeyesuraj,official 答案由 adarshr 提供。如果你想要自己的分隔符,你可以试试 JoeSlav 的答案,如果没有线程问题,你可以使用 StringBuilder 而不是 StringBuffer 来提高效率. krock 的回答很好,但在我看来有点矫枉过正。

标签: java arrays string


【解决方案1】:

Java 8+

使用String.join():

String str = String.join(",", arr);

请注意,arr 也可以是任何 Iterable(例如列表),而不仅仅是数组。

如果你有Stream,你可以使用加入收集器:

Stream.of("a", "b", "c")
      .collect(Collectors.joining(","))

旧版(Java 7 及更早版本)

StringBuilder builder = new StringBuilder();
for(String s : arr) {
    builder.append(s);
}
String str = builder.toString();

或者,如果您只想要数组的“调试式”转储:

String str = Arrays.toString(arr);

请注意,如果您真的是旧版(Java 1.4 及更早版本),则需要将其中的StringBuilder 替换为StringBuffer

安卓

使用TextUtils.join():

String str = TextUtils.join(",", arr);

一般说明

您可以根据字符串之间的字符(如果有)来修改上述所有示例。

DON'T 使用字符串并在循环中使用 += 附加到它,就像此处显示的一些答案一样。这会将 GC 发送到屋顶,因为您正在创建和丢弃与数组中的项目一样多的字符串对象。对于小型阵列,您可能不会真正注意到差异,但对于大型阵列,它可能会慢几个数量级。

【讨论】:

  • 感谢您解释为什么 StringBuilder 在追加方面优于 +=。
  • 我可以建议“要么使用 Array.toString()”部分。这会产生无用的输出,例如“[Ljava.lang.String;@25154f”。
  • 如果你在后台使用 +=,Java 会将其转换为使用 StringBuilder。
  • @matteo,你必须使用Arrays.toString(yourArray);,但我猜你使用了yourArray.toString();
  • 由于 java 1.8 你也可以使用 String::join,而不是 for 循环。 String.join("", arr);
【解决方案2】:

使用 Apache commons StringUtils.join()。它接受一个数组作为参数(并且还具有IterableIterator 参数的重载)并在每个元素(如果它不为空)上调用toString() 以获取每个元素的字符串表示形式。然后将每个元素字符串表示形式连接成一个字符串,如果指定了一个分隔符,则在其之间有一个分隔符:

String joinedString = StringUtils.join(new Object[]{"a", "b", 1}, "-");
System.out.println(joinedString);

生产:

a-b-1

【讨论】:

  • 次要修复:joinedString = StringUtils.join(new Object[]{"a", "b", "1"}, "-");
【解决方案3】:

我喜欢为此使用Google's Guava Joiner,例如:

Joiner.on(", ").skipNulls().join("Harry", null, "Ron", "Hermione");

将产生与以下相同的字符串:

new String("Harry, Ron, Hermione");

ETA:Java 8 现在也有类似的支持:

String.join(", ", "Harry", "Ron", "Hermione");

看不到对跳过空值的支持,但这很容易解决。

【讨论】:

  • 但如果我们忠实于情节,null 将是“他的名字不能被提及”:-)
  • 如果你很勇敢:;-) Joiner.on(", ").useForNull("Voldemort").join("Harry", null, "Ron", "Hermione");
  • 使用 java-8 String.join(", ", "Harry", null, "Ron", "Hermione").replaceAll("null", "Voldermart");
【解决方案4】:

从 Java 8 开始,我认为最简单的方法是:

    String[] array = { "cat", "mouse" };
    String delimiter = "";
    String result = String.join(delimiter, array);

这样您可以选择任意分隔符。

【讨论】:

    【解决方案5】:

    你可以这样做,给定一个原始类型的数组a

    StringBuffer result = new StringBuffer();
    for (int i = 0; i < a.length; i++) {
       result.append( a[i] );
       //result.append( optional separator );
    }
    String mynewstring = result.toString();
    

    【讨论】:

    • StringBuffer 是旧的,使用 StringBuilder 代替它没有不必要的同步在一个线程中使用。
    【解决方案6】:

    试试Arrays.deepToString 方法。

    返回指定的“深层内容”的字符串表示 大批。如果数组包含其他数组作为元素,则字符串 表示包含它们的内容等等。这种方法是 设计用于将多维数组转换为字符串

    【讨论】:

    • 如果您不需要太多控制,我相信这是最简单的解决方案,因为您不需要第三方库。这是一个例子: System.out.println(Arrays.deepToString(args));
    【解决方案7】:

    尝试Arrays.toString 重载方法。

    或者,试试下面的通用实现:

    public static void main(String... args) throws Exception {
    
        String[] array = {"ABC", "XYZ", "PQR"};
    
        System.out.println(new Test().join(array, ", "));
    }
    
    public <T> String join(T[] array, String cement) {
        StringBuilder builder = new StringBuilder();
    
        if(array == null || array.length == 0) {
            return null;
        }
    
        for (T t : array) {
            builder.append(t).append(cement);
        }
    
        builder.delete(builder.length() - cement.length(), builder.length());
    
        return builder.toString();
    }
    

    【讨论】:

    • 然后告诉我们您正在寻找的格式。否则,我们无法猜测您的想法。
    【解决方案8】:

    下面是一个数组到字符串转换的例子。

    公共类 ArrayToString {
    公共静态无效主要(字符串 [] 参数) { String[] strArray = new String[]{"Java", "PHP", ".NET", "PERL", "C", "COBOL"};
            String newString = Arrays.toString(strArray);
    
            newString = newString.substring(1, newString.length()-1);
    
            System.out.println("New New String: " + newString);
        }
    }
    

    【讨论】:

      【解决方案9】:
      String[] strings = new String[25000];
      for (int i = 0; i < 25000; i++) strings[i] = '1234567';
      
      String result;
      result = "";
      for (String s : strings) result += s;
      //linear +: 5s
      
      result = "";
      for (String s : strings) result = result.concat(s);
      //linear .concat: 2.5s
      
      result = String.join("", strings);
      //Java 8 .join: 3ms
      
      Public String join(String delimiter, String[] s)
      {
          int ls = s.length;
          switch (ls)
          {
              case 0: return "";
              case 1: return s[0];
              case 2: return s[0].concat(delimiter).concat(s[1]);
              default:
                  int l1 = ls / 2;
                  String[] s1 = Arrays.copyOfRange(s, 0, l1); 
                  String[] s2 = Arrays.copyOfRange(s, l1, ls); 
                  return join(delimiter, s1).concat(delimiter).concat(join(delimiter, s2));
          }
      }
      result = join("", strings);
      // Divide&Conquer join: 7ms
      

      如果您别无选择,只能使用 Java 6 或 7,那么您应该使用分治连接。

      【讨论】:

        【解决方案10】:

        使用 Apache Commons 的 StringUtils library 的 join 方法。

        String[] stringArray = {"a","b","c"};
        StringUtils.join(stringArray, ",");
        

        【讨论】:

          【解决方案11】:

          您想要从 arrayList 生成字符串的代码,

          Iterate through all elements in list and add it to your String result
          

          您可以通过 2 种方式执行此操作:使用 String 作为结果或使用 StringBuffer/StringBuilder。

          示例:

          String result = "";
          for (String s : list) {
              result += s;
          }
          

          ...但是由于性能原因,这不是好的做法。更好的是使用StringBuffer(线程安全)或StringBuilder,它们更适合添加字符串

          【讨论】:

            【解决方案12】:

            当我们使用流时,我们确实有更大的灵活性,例如
            map --> 将任何数组对象转换为 toString
            过滤器 --> 为空时删除
            join --> 添加加入字符

                //Deduplicate the comma character in the input string
                String[] splits = input.split("\\s*,\\s*");
                return Arrays.stream(splits).filter(StringUtils::isNotBlank).collect(Collectors.joining(", "));
            

            【讨论】:

              【解决方案13】:
              String array[]={"one","two"};
              String s="";
              
              for(int i=0;i<array.length;i++)
              {
                s=s+array[i];
              }
              
              System.out.print(s);
              

              【讨论】:

              • 你的答案和smas基本一样;稍微复杂一点;因此肯定不是“最容易”的一个。此外,Arrays.toString() 更简单。
              【解决方案14】:

              如果你知道数组有多少元素,一个简单的方法是这样做:

              String appendedString = "" + array[0] + "" + array[1] + "" + array[2] + "" + array[3]; 
              

              【讨论】:

              • 这在现实世界中几乎不适用,并且显示了一些不良的编程习惯。
              • 如果达到 -50 个负片可能会是一枚很棒的金牌
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-04-17
              • 2012-10-20
              • 2011-02-16
              • 2011-06-18
              相关资源
              最近更新 更多