繁体   English   中英

如何形成一个包含从 0 到 n 的数字的字符串

[英]How can I form a string containing numbers from 0 to n

例如,当n = 5 ,我需要生成一个字符串"012345"

我可以通过运行从0nfor循环并将数字附加到字符串来实现。

for(int i = 0; i <= n; i++) {
    s += i;
}

有没有没有for循环的简单方法? 也许使用流?

我认为最好的方法是你已经在你的问题中使用循环完成了它。 阅读评论,这似乎是普遍的共识。 Nikolas Charalambidis评论中指出,该解决方案可以使用StringBuilder代替:

StringBuilder s = new StringBuilder();
for(int i = 0; i <= n; i++) {
  s.append(i);
}

如果您必须使用Stream ,我相信接受的答案是要走的路,因为

  1. 我认为它只是看起来“干净”而且
  2. 它还使用StringBuilder而不是String 还有其他方法。

一种方法是依赖副作用。 创建一个变量并从流中更新它。 包 java.util.stream上的 JavaDoc 警告使用:

通常不鼓励流操作的行为参数的副作用,因为它们通常会导致在不知情的情况下违反无状态要求,以及其他线程安全危险。

String[] alternativeWayA = {""};
IntStream.rangeClosed(0,n).forEach(i -> alternativeWayA[0] = alternativeWayA[0] + i);

Luiggi Mendoza在一条评论中提到

您可以使用collect(Collectors.joining())并具有相同的输出

并在另一条评论中

好吧,你可以在调用collect之前使用boxed

String alternativeWayB = IntStream.rangeClosed(0,n)
                                  .boxed()
                                  .map(i -> i.toString())
                                  .collect(Collectors.joining(""));

..如果人们更喜欢使用reduce而不是Collectors.joining

String alternativeWayC = IntStream.rangeClosed(0,n)
                                  .boxed()
                                  .map(i -> i.toString())
                                  .reduce("", String::concat);

..或者正如Nikolas Charalambidis在此评论中所建议的那样

您需要mapToObj因为此收集器不可用于IntStream

String alternativeWayD = IntStream.rangeClosed(0,n)
                                  .mapToObj(i -> String.valueOf(i))
                                  .collect(Collectors.joining(""));

Holger发表了评论

String string = new String(IntStream.rangeClosed('1', '1'+n).toArray(), 0, n);

我认为它非常优雅,适用于n < 10 对于n = 15 ,结果变为0123456789:;<=>? 因为它使用字符的整数值。 我在String构造函数的最后一个参数中添加了一个+ 1

String alternativeWayE = new String(IntStream.rangeClosed('0', '0'+n).toArray(), 0, n + 1);

使用IntStreamStringBuilder

int n = 5;
String string = IntStream.rangeClosed(0, n)
     .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
     .toString();

但是,对于这种特殊情况,最好将 for 循环与StringBuilder

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM