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开始进行多次迭代会更加高效.
如果有人能解释为什么会这样,我很高兴知道.
为这个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(","); 更好的性能
| 归档时间: |
|
| 查看次数: |
3414 次 |
| 最近记录: |