在数组中将元素连接成字符串

34

我有点困惑。我无法在任何地方找到答案 ;(

我有一个字符串数组:

String[] arr = ["1", "2", "3"];

然后我通过以下方式将其转换为字符串:

String str = Arrays.toString(arr);
System.out.println(str);

我本希望得到字符串 "123",但我得到了字符串 "[1,2,3]"

在Java中该怎么做呢?我正在使用Eclipse IDE。


1
为什么不循环并连接数组中的每个元素? - ogzd
@LGAP 这看起来不太对。 - Denys Séguret
我已经尝试过了,但是以我的方式并没有成功。 - Leo
4
你为什么将整数值存储在字符串数组中?(原文已翻译,无需修改) - Rohit Jain
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#toString(int[]) - Ofiris
这只是一个例子 ;) - Leo
19个回答

58

使用StringBuilder代替StringBuffer, 因为它比StringBuffer更快。

示例代码

String[] strArr = {"1", "2", "3"};
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < strArr.length; i++) {
   strBuilder.append(strArr[i]);
}
String newString = strBuilder.toString();

这是为什么使用字符串连接的一种更好解决方案:当您连接2个字符串时,将创建一个新的字符串对象,并执行逐字符复制。实际上,这意味着代码复杂度将是数组大小的平方!

(每次迭代复制的字符数为1+2+3+...n)。StringBuilder在此情况下仅需执行一次“复制到字符串”操作,将复杂度降至O(n)


仅提供代码片段的答案并不是很有帮助。请考虑添加一些注释或简要解释其功能。 :) - bahrep
1
这仍然是最佳答案,因为其他方法使用字符串拼接。 - Steve Kuo
11
使用StringBuilder而不是StringBuffer。StringBuffer是线程安全的,在这个例子中不需要。 - walv
1
这是我到目前为止尝试过最快的解决方案,点个赞! - vefthym
@walv 谢谢你的好建议,我已经修改了我的回答 :) - Naveen Kumar Alone

16
Arrays.toString(arr);

输出是 [1,2,3],你将其存储到字符串中并打印它,所以你得到的输出是 [1,2,3]。

如果你想获得输出123,请尝试这样做:

public static void main(String[] args) {
    String[] arr= {"1","2","3"};
    String output ="";
    for(String str: arr)
        output=output+str;
    System.out.println(output);


}

输出:

123

13
请勿使用字符串连接操作,应该使用StringBuilder/Buffer或者其他合适的方式。 - Radek Skokan
2
我简直不敢相信有13个人真的同意使用字符串连接!我想用StringBuilder来替换,使Radek变成双倍。 - Deian

15
简单回答: ``` Arrays.toString(arr); ```

6
Arrays.toString(arr) 会返回类似 [1,2,3] 的结果。他并不需要这种格式。 - Arun Kumar Mudraboyina

6
在Java 8中只需使用一行代码即可实现:String.join("", arr);

6

Arrays.toString:(至少对于其Object []版本来说,来自API)


Arrays.toString是Java中的一个方法,用于将数组转换为字符串以便于输出或打印。它可以处理各种类型的数组,包括对象数组。
public static String toString(Object[] a) {
    if (a == null)
        return "null";
    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(String.valueOf(a[i]));
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

那意味着它在开头插入了 [,在结尾插入了 ],并在元素之间插入了 ,如果您希望不包含这些字符:(使用 StringBuilder 比下面的代码更快,但它不能是小量代码)。
String str = "";
for (String i:arr)
  str += i;
System.out.println(str);

注:

String[] arr[3]= [1,2,3] 无法编译通过。

可能你想要的是:String[] arr = {"1", "2", "3"};


如果您正在连接非常大的字符串,则不应在每次迭代中询问i == iMax吗!只需始终添加分隔符,然后在循环结束后删除最后一个分隔符即可! - Sauer
@Sauer 请注意,第一个代码示例不是我自己编写的,它是直接从Java API复制并粘贴过来的。您是指一个非常大的数组吗?字符串的大小对于i == iMax检查无关紧要。还要注意,检查i == iMax是一种非常非常快速的操作(而且您需要检查以确定for循环的结束方式,在任何情况下都可能存在;请注意,for循环看起来不像这样: for(int i = 0; i!= iMax; i ++))。 - Bernhard Barker

6
使用Arrays.toString()函数。它可以使您的代码更短,更易读。它在内部使用字符串构建器,因此也很高效。为了去除多余的字符,您可以选择使用String.replace()函数消除它们,但这会降低可读性。
String str = Arrays.toString(arr).replaceAll(", |\\[|\\]", "");

这与Tris Nefzger的答案类似,但不需要冗长的子字符串构造来摆脱方括号。

正则表达式的解释:"|"表示任何", "和"["以及"]"。 "\\"告诉Java字符串我们不是指一些特殊字符(如换行符"\n"或制表符"\t"),而是一个真正的反斜杠"\"。因此,Regex解释器读取"\[",它告诉它我们指的是一个字面上的方括号,而不想将其用作Regex语言的一部分(例如,"[^3]*"表示任意数量的字符,但它们都不应该是"3")。


3

Guava提供了Joiner实用工具来解决这个问题:

例如:

String joinWithoutSeparator = Joiner.on("").join(1, 2, 3); // returns "123"
String joinWithSeparator = Joiner.on(",").join(1, 2, 3); // returns "1,2,3"

3

我刚刚写了以下内容:

public static String toDelimitedString(int[] ids, String delimiter)
{
    StringBuffer strb = new StringBuffer();
    for (int id : ids)
    {
      strb.append(String.valueOf(id) + delimiter);
    }
    return strb.substring(0, strb.length() - delimiter.length());
 }

1
由于您不需要并发,建议使用StringBuilder而非StringBuffer。此外,循环的主体应该是 strb.append(String.valueOf(id)).append(delimiter) ,以完全避免在String上使用 + - Patrick

2
使用 Guava 的 Joiner(在 r18 中内部使用 StringBuilder
String[]  arr= {"1","2","3"};
Joiner noSpaceJoiner = Joiner.on("");
noSpaceJoiner.join(arr))

"Joiner"很有用,因为它是线程安全的和不可变的,可以在许多地方重复使用而不必复制代码。在我看来,它也更易读。
使用Java 8的Stream支持,我们还可以将其简化为一行代码。
String concat = Stream.of(arr).collect(Collectors.joining());

在这种情况下,两个输出都是123

2

这是一个将字符串数组转换为字符串的小代码,不包含 [],

String[] strArray = new String[]{"Java", "String", "Array", "To", "String", "Example"};

String str = Arrays.toString(strArray);
            str = str.substring(1, str.length()-1).replaceAll(",", "");
  • 首先将数组转换为字符串。
  • 其次,从x到y位置获取文本。
  • 第三步,将所有的','替换为""。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接