我有一个数组列表,我想把它完全输出为字符串。本质上,我想使用每个元素的toString按顺序输出它,每个元素由制表符分隔。有什么快速的方法吗?你可以循环遍历它(或删除每个元素),并将它连接到一个字符串,但我认为这将是非常缓慢的。


当前回答

如果你正在寻找一个快速的一行程序,从Java 5开始,你可以这样做:

myList.toString().replaceAll("\\[|\\]", "").replaceAll(", ","\t")

此外,如果你的目的只是打印出内容,不太关心“\t”,你可以简单地这样做:

myList.toString()

哪个返回一个字符串

[str1, str2, str3]

如果你有一个数组(不是ArrayList),那么你可以像这样完成:

 Arrays.toString(myList).replaceAll("\\[|\\]", "").replaceAll(", ","\t")

其他回答

在Java 8或更高版本中:

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

如果列表不是String类型,则可以使用连接收集器:

String listString = list.stream().map(Object::toString)
                        .collect(Collectors.joining(", "));

以下几点可以吗?

List<String> streamValues = new ArrayList<>();
Arrays.deepToString(streamValues.toArray()));   

循环遍历它并调用toString。没有什么神奇的方法,如果有的话,你认为它在被子下面除了循环之外会做什么?唯一的微优化是使用StringBuilder而不是String,即使这也不是一个巨大的胜利-连接字符串在幕后变成了StringBuilder,但至少如果您以这种方式编写它,您可以看到正在发生什么。

StringBuilder out = new StringBuilder();
for (Object o : list)
{
  out.append(o.toString());
  out.append("\t");
}
return out.toString();

你可以使用正则表达式。这是最简洁的了

System.out.println(yourArrayList.toString().replaceAll("\\[|\\]|[,][ ]","\t"));

如果你不想让最后一个元素后面的最后一个\t,你必须使用索引来检查,但请记住,这只在lists实现RandomAccess时“有效”(即O(n))。

List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder(list.size() * apprAvg); // every apprAvg > 1 is better than none
for (int i = 0; i < list.size(); i++) {
    sb.append(list.get(i));
    if (i < list.size() - 1) {
        sb.append("\t");
    }
}
System.out.println(sb.toString());