如何从ArrayList获取String值并将它们存储在Java 8中用逗号分隔的单个字符串中?

dan*_*ilo 6 java stringbuilder list java-8

我有一个带有一些字符串的ArrayList.我想将ArrayList中的数字列表存储在由逗号分隔的单个字符串中,如下所示.

String s = "350000000000050287,392156486833253181,350000000000060764"
Run Code Online (Sandbox Code Playgroud)

这是我的清单:

   List<String> e = new ArrayList<String>();

    e.add("350000000000050287");
    e.add("392156486833253181");
    e.add("350000000000060764");
Run Code Online (Sandbox Code Playgroud)

我一直试图通过以下方式实现:

     StringBuilder s = new StringBuilder();
    for (String id : e){

        s.append(id+",");

    }
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,这会在最后添加一个逗号,我不希望这样.最好的方法是什么?

谢谢

Tim*_*Tim 18

最简单的解决方案是使用String.join:

List<String> list = new ArrayList<String>();

list.add("11");
list.add("22");
list.add("33");

String joined = String.join(",", list);

System.out.println(joined);
//prints "11,22,33"
Run Code Online (Sandbox Code Playgroud)

请注意,这需要Java 8.


但是,如果要支持旧版本的Java,可以使用迭代器修复代码:

StringBuilder sb = new StringBuilder();

Iterator<String> iterator = list.iterator();

// First time (no delimiter):
if (iterator.hasNext()) {
    sb.append(iterator.next());

    // Other times (with delimiter):
    while (iterator.hasNext()) {
        sb.append(",");
        sb.append(iterator.next());
    }
}
Run Code Online (Sandbox Code Playgroud)

或者只是使用布尔值来确定第一次:

StringBuilder sb = new StringBuilder();

boolean firstTime = true;

for (String str : list) {

    if (firstTime) {
        firstTime = false;
    } else {
        sb.append(",");
    }

    sb.append(str);
}
Run Code Online (Sandbox Code Playgroud)

但后者显然不如使用迭代器比较每个方法生成的字节码.然而,正如Tagir Valeev指出的那样,这可能不是真的:这个基准测试向我们表明,使用一个标志从10开始进行多次迭代会更加高效.

如果有人能解释为什么会这样,我很高兴知道.

  • 如果你没有CharSequence或它的一个子类的列表,你可以获取一个流,将每个对象映射到它的`toString`表示并使用`collect(joined(","))`这样: `String s = myList.stream().map(Object :: toString).collect(Collectors.joining(","));` (5认同)

Sur*_*tta 7

为这个Java 8解决方案的Tim Upvote;)

如果您不使用JDK 8

   StringBuilder s = new StringBuilder();
    for (String id : e){

        s.append(id).append(",");

    }
   String result =s.toString().replaceAll(",$", "");
Run Code Online (Sandbox Code Playgroud)

我用的正则表达式",$"是检测最后一个逗号.

而且,如果你看到的,我换成s.append(id +",");具有 s.append(id).append(","); 更好的性能