我有一个 ArrayList
,我想将其完整地输出为一个字符串。基本上,我想使用每个元素的toString
按顺序分隔以制表符的方式来输出它。有没有一种快速的方法可以做到这一点?你可以循环遍历它(或者移除每个元素)并将其连接到一个字符串中,但我认为这将非常慢。
我有一个 ArrayList
,我想将其完整地输出为一个字符串。基本上,我想使用每个元素的toString
按顺序分隔以制表符的方式来输出它。有没有一种快速的方法可以做到这一点?你可以循环遍历它(或者移除每个元素)并将其连接到一个字符串中,但我认为这将非常慢。
在Java 8及以后版本中:
String listString = String.join(", ", list);
如果列表
不是字符串类型,则可以使用连接收集器:
String listString = list.stream().map(Object::toString)
.collect(Collectors.joining(", "));
如果你正在使用Android,则有一个称为TextUtils的实用工具,它有一个.join(String delimiter, Iterable)
方法可以做到这一点。
List<String> list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
String joined = TextUtils.join(", ", list);
显然这个功能只适用于Android,但我觉得把它添加到这个帖子中也挺好的...
TextUtils.join
接受一个 Object[]
,我认为它会在每个标记上调用 toString()
。 PatientDetails
是否实现了 toString()
?如果这不能解决问题,你可能需要使用 Separator
类来处理。 - JJ Geewaxorg.apache.lang3.StringUtils
几乎相同,因此你的答案对我非常有用,不仅限于 Android :) - avalanchaString.join(separator, list)
方法; 参见Vitalii Federenko的答案。ArrayList
是唯一的选择:
请勿使用此代码,请继续阅读本答案底部以了解为什么不建议使用它,以及应该使用哪些代码:
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
String listString = "";
for (String s : list)
{
listString += s + "\t";
}
System.out.println(listString);
javac
编译器会将字符串拼接优化为一系列StringBuilder
上的append
操作。以下是上述程序中for
循环的字节码反汇编的一部分: 61: new #13; //class java/lang/StringBuilder
64: dup
65: invokespecial #14; //Method java/lang/StringBuilder."<init>":()V
68: aload_2
69: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
72: aload 4
74: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
77: ldc #16; //String \t
79: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
82: invokevirtual #17; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
StringBuilder
对循环进行了优化,因此性能不应该是一个大问题。(好吧,仔细一看,StringBuilder
在每次循环迭代时都被实例化,所以它可能不是最有效的字节码。手动实例化并使用显式的StringBuilder
可能会产生更好的性能。)事实上,我认为任何输出(无论是到磁盘还是屏幕)都将比担心字符串连接的性能慢至少一个数量级。
编辑:正如评论中指出的那样,上述编译器优化确实在每次迭代中创建了StringBuilder
的新实例。(我之前已经注意到了这一点。)最优化的技术将使用Paul Tomblin的响应,因为它只在for
循环之外实例化单个StringBuilder
对象。ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
StringBuilder sb = new StringBuilder();
for (String s : list)
{
sb.append(s);
sb.append("\t");
}
System.out.println(sb.toString());
为了提高代码效率,循环外只需要实例化StringBuilder
一次,在循环内部调用两次append
方法。下面的字节码显示了StringBuilder
的实例化和循环:
// Instantiation of the StringBuilder outside loop:
33: new #8; //class java/lang/StringBuilder
36: dup
37: invokespecial #9; //Method java/lang/StringBuilder."<init>":()V
40: astore_2
// [snip a few lines for initializing the loop]
// Loading the StringBuilder inside the loop, then append:
66: aload_2
67: aload 4
69: invokevirtual #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
72: pop
73: aload_2
74: ldc #15; //String \t
76: invokevirtual #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
79: pop
for
循环内部较短且不需要在每次迭代中实例化StringBuilder
。Java
жҲ–Geewaxзҡ„Android
д»ҘиҺ·еҸ–жӣҙеҘҪзҡ„зӯ”жЎҲгҖӮ - Gibolt下载 Apache Commons Lang 并使用该方法
StringUtils.join(list)
StringUtils.join(list, ", ") // 2nd param is the separator.
当然你可以自己实现它,但是他们的代码经过了充分测试,并且可能是最好的实现。
我是Apache Commons库的忠实粉丝,同时认为它是Java标准库的重要补充。
StringUtils.join(list.toArray(),"\t")
。 - MuhdJoiner.on(", ").withKeyValueSeparator(": ").join(myMap)
连接 Map。 - karmakaze将可读的、有意义的字符串转换为列表是每个人都可能遇到的常见问题。
情况1。如果您的类路径中有apache的StringUtils(如来自rogerdpack和Ravi Wallau):
import org.apache.commons.lang3.StringUtils;
String str = StringUtils.join(myList);
案例2。如果你只想使用来自JDK(7)的方式:
import java.util.Arrays;
String str = Arrays.toString(myList.toArray());
永远不要自己造轮子,不要为这个一行代码的任务使用循环。
Arrays.toString(myList.toArray())
- 这是最简单和最直接的解决方案。将列表转化为数组并以字符串形式返回。 - Ondrej Bozek"[a, b]"
,在转换回数组时可能会出现问题。我个人认为最好使用String.join(",", myList)
。 - undefined如果您需要一个简短的方法,在Java 5及以上版本中,您可以这样做:
myList.toString().replaceAll("\\[|\\]", "").replaceAll(", ","\t")
myList.toString()
该函数返回一个字符串,如下所示:
[str1, str2, str3]
如果您有一个数组(不是ArrayList),则可以通过以下方式实现相同的效果:
Arrays.toString(myList).replaceAll("\\[|\\]", "").replaceAll(", ","\t")
x
个州的n
个城市中的m
个家庭中寻找一个人,你可能会说它是O(mnx)
或者O(n^3)
,但是如果我改为“在这个国家中寻找这个人”,你会立刻告诉我是O(n)
。此外,所有的算法都通常是O(n)
,没有循环内部循环。 - Jai循环遍历并调用toString。没有什么神奇的方法,如果有的话,在底层它会做什么除了循环遍历?唯一的微小优化可能是使用StringBuilder而不是String,但即使如此也不会带来巨大的收益 - 字符串拼接在底层会转换为StringBuilder,但至少如果你以这种方式编写代码,你可以看到正在发生什么。
StringBuilder out = new StringBuilder();
for (Object o : list)
{
out.append(o.toString());
out.append("\t");
}
return out.toString();
大多数Java项目通常都有可用的apache-commons lang库。StringUtils.join()方法非常好用,而且有多种变体,可以满足几乎所有需求。
public static java.lang.String join(java.util.Collection collection,
char separator)
public static String join(Iterator iterator, String separator) {
// handle null, zero and one elements before building a buffer
Object first = iterator.next();
if (!iterator.hasNext()) {
return ObjectUtils.toString(first);
}
// two or more elements
StringBuffer buf =
new StringBuffer(256); // Java default is 16, probably too small
if (first != null) {
buf.append(first);
}
while (iterator.hasNext()) {
if (separator != null) {
buf.append(separator);
}
Object obj = iterator.next();
if (obj != null) {
buf.append(obj);
}
}
return buf.toString();
}
参数:
collection - 要连接在一起的值的集合,可以为null
separator - 要使用的分隔符字符
返回值: 连接后的字符串,如果输入为空迭代器则返回null
自从2.3版本以来
join(...)
方法对于数组和集合都有变体。 - vikingsteve Collections.shuffle(L);
StringBuilder sb = new StringBuilder();
L.forEach(e -> sb.append(e));
return sb.toString();
- dobrivoje对于这个简单的用例,您可以简单地使用逗号将字符串连接起来。如果您使用Java 8:
String csv = String.join("\t", yourArray);
String csv = org.apache.commons.lang3.StringUtils.join(yourArray, "\t");