如何从 ArrayList 中获取字符串值并将它们存储在以逗号分隔的单个字符串中,在 Java 8 中?
How to get String values from ArrayList and store them in a single string separated by commas, in Java 8?
我有一个包含一些字符串的 ArrayList。我想将 ArrayList 中的数字列表存储在一个由逗号分隔的字符串中,如下所示。
String s = "350000000000050287,392156486833253181,350000000000060764"
这是我的清单:
List<String> e = new ArrayList<String>();
e.add("350000000000050287");
e.add("392156486833253181");
e.add("350000000000060764");
我一直在尝试通过以下方式进行:
StringBuilder s = new StringBuilder();
for (String id : e){
s.append(id+",");
}
唯一的问题是这会在末尾添加一个逗号,我不希望 that.What 是最好的方法?
谢谢
为 Tim 的 Java 8 解决方案投票 ;)
如果您不使用 JDK 8
StringBuilder s = new StringBuilder();
for (String id : e){
s.append(id).append(",");
}
String result =s.toString().replaceAll(",$", "");
我使用的正则表达式 ",$"
是检测最后一个逗号。
如果你看到了,我将 s.append(id +",");
替换为 s.append(id).append(",");
以获得更好的性能
最简单的解决方案是使用 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"
请注意,这需要 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());
}
}
或者干脆用一个布尔值来判断第一次:
StringBuilder sb = new StringBuilder();
boolean firstTime = true;
for (String str : list) {
if (firstTime) {
firstTime = false;
} else {
sb.append(",");
}
sb.append(str);
}
但后者的性能显然不如使用迭代器比较每个方法生成的字节码。然而,这可能不是真的,因为 Tagir Valeev pointed out: this benchmark 向我们展示了使用标志的性能更高,迭代次数从 10 开始。
如果有人能解释为什么会这样,我很乐意知道。
您可以使用布尔标志来检查第一次迭代,如果不是第一次迭代,则在追加 id
.
之前追加 ","
这可能会解决您的问题。
boolean first = true;
for (String id : e){
if(!first)
s.append(",");
else
first = false;
s.append(id);
}
注意
如果你使用Java8那么按照蒂姆的解决方案。
尝试通过检查当前索引是否是列表的最后一个值 (e.size-1) 来遍历您的列表,如果它不是最后一个值,则像往常一样用“,”连接字符串,如果是,则连接时不要使用“,”。
List<String> e = new ArrayList<>(Arrays.asList("3333", "4444", "3333"));
StringBuilder s = new StringBuilder();
for (int i = 0; i < e.size(); i++) {
s.append(e.get(i)).append((i == e.size() - 1) ? "" : ",");
}
StringBuilder s = new StringBuilder();
for(int i = 0; i < e.size()-1; i++){
s.append(e.get(i)+",")
}
s.append(e.get(i))
如果我们谈论 Java 8,那么:
Collection<String> e = asList("a", "b", "c");
String result = e.stream().collect(Collectors.joining(",")); // a,b,c
此方法可以应用于任何 Collection
个字符串,以及 String.join()
。
Collectors.joining(",")
,在你的情况下效果很好,示例实现:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Solution {
public static void main(String[] args) {
List<String> e = new ArrayList<>();
e.add("350000000000050287");
e.add("392156486833253181");
e.add("350000000000060764");
System.out.println(e.stream().collect(Collectors.joining(",")));
}
}
输出:
350000000000050287,392156486833253181,350000000000060764
List<String> e = new ArrayList<String>();
e.add("350000000000050287");
e.add("392156486833253181");
e.add("350000000000060764");
Iterator iterator = e.iterator();
String s="";
int i = 1;
while (iterator.hasNext()) {
if (i == e.size()) {
s =s+iterator.next();
} else {
s =s+iterator.next()+",";
}
i++;
}
System.out.println(s);
350000000000050287,392156486833253181,350000000000060764
我有一个包含一些字符串的 ArrayList。我想将 ArrayList 中的数字列表存储在一个由逗号分隔的字符串中,如下所示。
String s = "350000000000050287,392156486833253181,350000000000060764"
这是我的清单:
List<String> e = new ArrayList<String>();
e.add("350000000000050287");
e.add("392156486833253181");
e.add("350000000000060764");
我一直在尝试通过以下方式进行:
StringBuilder s = new StringBuilder();
for (String id : e){
s.append(id+",");
}
唯一的问题是这会在末尾添加一个逗号,我不希望 that.What 是最好的方法?
谢谢
为 Tim 的 Java 8 解决方案投票 ;)
如果您不使用 JDK 8
StringBuilder s = new StringBuilder();
for (String id : e){
s.append(id).append(",");
}
String result =s.toString().replaceAll(",$", "");
我使用的正则表达式 ",$"
是检测最后一个逗号。
如果你看到了,我将 s.append(id +",");
替换为 s.append(id).append(",");
以获得更好的性能
最简单的解决方案是使用 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"
请注意,这需要 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());
}
}
或者干脆用一个布尔值来判断第一次:
StringBuilder sb = new StringBuilder();
boolean firstTime = true;
for (String str : list) {
if (firstTime) {
firstTime = false;
} else {
sb.append(",");
}
sb.append(str);
}
但后者的性能显然不如使用迭代器比较每个方法生成的字节码。然而,这可能不是真的,因为 Tagir Valeev pointed out: this benchmark 向我们展示了使用标志的性能更高,迭代次数从 10 开始。
如果有人能解释为什么会这样,我很乐意知道。
您可以使用布尔标志来检查第一次迭代,如果不是第一次迭代,则在追加 id
.
","
这可能会解决您的问题。
boolean first = true;
for (String id : e){
if(!first)
s.append(",");
else
first = false;
s.append(id);
}
注意
如果你使用Java8那么按照蒂姆的解决方案。
尝试通过检查当前索引是否是列表的最后一个值 (e.size-1) 来遍历您的列表,如果它不是最后一个值,则像往常一样用“,”连接字符串,如果是,则连接时不要使用“,”。
List<String> e = new ArrayList<>(Arrays.asList("3333", "4444", "3333"));
StringBuilder s = new StringBuilder();
for (int i = 0; i < e.size(); i++) {
s.append(e.get(i)).append((i == e.size() - 1) ? "" : ",");
}
StringBuilder s = new StringBuilder();
for(int i = 0; i < e.size()-1; i++){
s.append(e.get(i)+",")
}
s.append(e.get(i))
如果我们谈论 Java 8,那么:
Collection<String> e = asList("a", "b", "c");
String result = e.stream().collect(Collectors.joining(",")); // a,b,c
此方法可以应用于任何 Collection
个字符串,以及 String.join()
。
Collectors.joining(",")
,在你的情况下效果很好,示例实现:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Solution {
public static void main(String[] args) {
List<String> e = new ArrayList<>();
e.add("350000000000050287");
e.add("392156486833253181");
e.add("350000000000060764");
System.out.println(e.stream().collect(Collectors.joining(",")));
}
}
输出:
350000000000050287,392156486833253181,350000000000060764
List<String> e = new ArrayList<String>();
e.add("350000000000050287");
e.add("392156486833253181");
e.add("350000000000060764");
Iterator iterator = e.iterator();
String s="";
int i = 1;
while (iterator.hasNext()) {
if (i == e.size()) {
s =s+iterator.next();
} else {
s =s+iterator.next()+",";
}
i++;
}
System.out.println(s);
350000000000050287,392156486833253181,350000000000060764