Java 如何形成包含从0到n的数字的字符串
例如,当Java 如何形成包含从0到n的数字的字符串,java,string,java-stream,Java,String,Java Stream,例如,当n=5时,我需要生成一个字符串“012345” 我可以通过运行一个从0到n的for循环并在字符串中添加数字来实现 for(int i = 0; i <= n; i++) { s += i; } 对于(inti=0;i使用IntStream和StringBuilder: int n = 5; String string = IntStream.rangeClosed(0, n) .collect(StringBuilder::new, StringBuilder:
n=5
时,我需要生成一个字符串“012345”
我可以通过运行一个从0
到n
的for
循环并在字符串中添加数字来实现
for(int i = 0; i <= n; i++) {
s += i;
}
对于(inti=0;i使用IntStream
和StringBuilder
:
int n = 5;
String string = IntStream.rangeClosed(0, n)
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
.toString();
然而,对于这种特殊情况,最好在StringBuilder
中使用for循环,我认为最好的方法是在您的问题中使用循环的方式。阅读评论,这似乎是普遍的共识。在一篇文章中指出,解决方案可以使用StringBuilder
instead:
StringBuilder s=new StringBuilder();
for(int i=0;i alternativeWayA[0]=alternativeWayA[0]+i);
一览无余
您可以使用collect(Collectors.joining())
并具有相同的输出
在另一个
嗯,您可以在调用collect
之前使用boxed
String alternativeWayB=IntStream.rangeClosed(0,n)
.boxed()
.map(i->i.toString())
.collect(收集器。连接(“”);
…如果喜欢使用减少而不是收集器。加入:
String alternativeWayC=IntStream.rangeClosed(0,n)
.boxed()
.map(i->i.toString())
.reduce(“,字符串::concat);
…或如本文所示
您需要mapToObj
,因为此收集器不适用于IntStream
String alternativeWayD=IntStream.rangeClosed(0,n)
.mapToObj(i->String.valueOf(i))
.collect(收集器。连接(“”);
贴上
String String=新字符串(IntStream.rangeClosed('1','1'+n).toArray(),0,n);
我认为它非常优雅,适用于n<10
。对于n=15
,结果变成0123456789:;?
,因为它使用了字符的整数值。我在字符串的最后一个参数中添加了+1
:
stringalternativewaye=新字符串(IntStream.rangeClosed('0','0'+n).toArray(),0,n+1);
您可以使用collect(Collectors.joining())
并且有相同的输出。好的,你可以在调用collect
@WJS之前使用boxed
。注意标记是,问题可能是更大问题的一部分,其中流是合理的。虽然我同意for循环更适合特定情况,但我找不到理由说服OP它是唯一正确的解决方案选项。此外,OP可能只是想了解和探索流AP的可能性。我可以添加一个关于for循环方法的注释,该方法显然更适合此特定情况,但我仍然不理解否决投票背后的原因。无论如何,感谢您的评论。String String=new String(IntStream.rangeClosed('1','1'+n).toArray(),0,n);
您不应该期望新构造的字符串出现在池中。这也适用于您的方法的结果(以及在StringBuilder
上调用toString
的任何结果)。因为将字符串放入池中是一个昂贵的操作,这并不是一个缺点。唯一保证被池化的字符串是编译时常量和调用intern()
的结果(但后者应该明智地使用,正如所说,添加到池中并不便宜).使用更简单的数字。0到n个数字或0到9个包含在内的数字。(即最多10个字符)?String s=“”;用于(int i=0;iI同意streams是一种较差的方法。但是您应该使用StringBuilder。@WJS true。但是直到Java 8 StringBuilder在字符串上使用+=
时才在内部使用。在Java的较新版本中,这一点发生了变化,以获得一种更好的机制,我忘记了它的名称…(另请参阅关于该主题的)@Matthieu编译器生成的代码是否使用StringBuilder
或其他技术并不重要。重要的是,循环中的+=
将在每次迭代中创建一个完整的字符串,导致O(n²)您应该避免的时间复杂性。无论Java版本如何,编译器都不会转换循环。请看,就在您链接的循环的正下方。一个很好的摘要!最后,使用StringBuilder
的for循环对我来说是最好的:)使用+1指出副作用。@NikolasCharalambidis是的,当然:)不过,我不愿意补充这一点,因为问题是寻找一个流实现。我觉得指出这一点没有错。但是,关于标记,[java Stream]的答案应该是存在的(当然,如果这种解决方案是可能的),并提供其他方法来改善情况(在这种简单的情况下是for循环)。