[英]How can I form a string containing numbers from 0 to n
例如,当n = 5
,我需要生成一个字符串"012345"
。
我可以通过运行从0
到n
的for
循环并将数字附加到字符串来实现。
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
,我相信接受的答案是要走的路,因为
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(""));
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);
使用IntStream
和StringBuilder
:
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.