簡體   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