如何使用可变数量的参数格式化字符串

How to format a string with a variable number of arguments

假设我有一个方法 returns 一个包含随机数字的列表 - 我们将调用该方法 List<Integer> getRandomNumberOfRandomNumbers();

System.out.println(String.format("Here are the random numbers: %s", getRandomNumberOfRandomNumbers()));

我知道这行不通,但我怎样才能达到这种效果?

示例输出

Here are the random numbers:

1 4 2 4

Here are the random numbers:

2 43 323 434 3423 54

例如,如果我们有一个 ListIntegers,如下所示:

List<Integer> var = new ArrayList<>();
var.add(1);
var.add(4);
var.add(2);
var.add(4);

然后以您想要的方式打印 List,您可以按照以下步骤操作:

System.out.println(String.format("Here are the random numbers:%n%n%s",
                             var.toString().replaceAll("[,\[,\]]", "")));

这输出:

Here are the random numbers:

1 4 2 4

此处 varlist 您的函数 getRandomNumberOfRandomNumbers() 正在返回,我们正在使用 var.toString() 将其转换为字符串,但它 returns [1, 4, 2, 4].因此,我们需要删除 [],。我使用正则表达式将它们替换为空字符。这实际上是一种简单易行的方法,但不确定它是否是一种有效的方法!每当我需要将 Colletion 转换为 String 时,我都会使用 toString() 方法,然后使用正则表达式做一些技巧以获得我想要的表示形式。

更新: 网上冲浪后,我发现没有几个选择。 (比我之前使用 List.toString() 的回答更受欢迎

例如,在你的情况下,你可以这样做:

StringJoiner sj = new StringJoiner(" ");
for (Integer i : var) {
    sj.add(String.valueOf(i));
}
System.out.println(sj.toString());

您可以使用以下两个备选方案执行相同的操作。

最简单的方法是将 getRandomNumberOfRandomNumbers return 所有数字都放在一个字符串中。或者你可以全部在线完成,像这样:

getRandomNumberOfRandomNumbers().stream()
    .map(Object::toString)
    .collect(Collectors.joining(" "));

另一个解决方案是遍历列表并在打印之前将值添加到字符串生成器

像这样:

StringBuilder stringBuilder = new StringBuilder();
for(Integer number : getRandomNumberOfRandomNumbers())
    stringBuilder.append(number + " ");
System.out.println("Here are the random numbers: " + stringBuilder.toString().trim());