[英]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.