我有一个数组列表,我想把它完全输出为字符串。本质上,我想使用每个元素的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(", "));

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

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

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

myList.toString()

哪个返回一个字符串

[str1, str2, str3]

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

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

在Java 8中,这很简单。参见整数列表的示例:

String result = Arrays.asList(1,2,3).stream().map(Object::toString).reduce((t, u) -> t + "\t" + u).orElse("");

或者多行版本(更容易阅读):

String result = Arrays.asList(1,2,3).stream()
    .map(Object::toString)
    .reduce((t, u) -> t + "\t" + u)
    .orElse("");

更新-一个更短的版本

String result = Arrays.asList(1,2,3).stream()
                .map(Object::toString)
                .collect(Collectors.joining("\t"));
List<String> stringList = getMyListOfStrings();
StringJoiner sj = new StringJoiner(" ");
stringList.stream().forEach(e -> sj.add(e));
String spaceSeparated = sj.toString()

您将希望用作分隔符的字符序列传递给新的StringJoiner。如果你想做一个CSV: new StringJoiner(", ");

处理尾随分隔符的一种优雅方法是使用类分隔符

StringBuilder buf = new StringBuilder();
Separator sep = new Separator("\t");
for (String each: list) buf.append(sep).append(each);
String s = buf.toString();

类分隔符的toString方法返回分隔符,除了第一次调用。因此,在打印列表时,不需要前面的分隔符(在本例中是这样)。