2012-05-08 116 views
21

我正在處理將字符分隔的列表返回給客戶端的服務器。 爲了建立這些名單我已經發現第一次迭代通過for-each循環:通過Java中的for-each循環檢測第一次迭代

StringBuilder builder = new StringBuilder() ; 
    boolean firstIterationFlag = true ; 

    for (String s : list){ 
     if (firstIterationFlag) { 
      firstIterationFlag = false ; 
     } else { 
      builder.append(separator); 
     } 
     builder.append(s) ;   
    } 
    return builder.toString() ; 

是否有這樣做沒有標誌的一種方式?

+0

爲什麼你必須檢測循環的第一次迭代? – BeRecursive

+0

而不是'forEach'循環,你可以手動做一個普通的'for'循環,從索引'1'開始而不是0. – Sheriff

+2

看看這個SO問題:http://stackoverflow.com/questions/63150/whats-the-best-way-to-build-a-string-of-delimited-items-in-java - 這可能是一個更好的解決方案。 –

回答

18

這種情況的一個簡單的方法是要注意,你可以隨時追加一個空字符串:

// For the first iteration, use a no-op separator 
String currentSeparator = ""; 
for (String s : list) { 
    builder.append(currentSeparator); 
    builder.append(s); 
    // From the second iteration onwards, use this 
    currentSeparator = separator; 
} 

或者(和preferrably)利用番石榴的Joiner類下手:)

這個「木匠「場景幾乎是總是這個要求給出的 - 所以只使用Joiner。對於其他情況,請使用常規for循環或根據您的代碼使用條件。

+1

+1對於Joiner,-1對於CurrentSeparator = +0 :-) –

+1

「if」被刪除,但更難以把握 –

+1

+1對於currentSeparator;) –

6

不使用的foreach,但通過手動使用迭代:

Iterator<String> it = list.iterator(); 
if(it.hasNext()){ 
    doSomeThingForTheFirstTime(it.next()); 
    while(it.hasNext()){ 
     doSomethingElse(it.next); 
    } 
} 

(順便說一句,這是幾乎什麼番石榴的木類內部呢,雖然上了一個臺階)

3

在特定的情況下,你引用,用番石榴的Joiner,而不是滾動您自己...

其中加入文本塊的對象(被指定爲一個數組,可迭代,可變參數,甚至是地圖)與分離。它可以將結果附加到Appendable或將它們作爲String返回。例如:

Joiner joiner = Joiner.on(separator).skipNulls(); 
return joiner.join(list); 
+1

+1(番石榴的Joiner遠遠超過apache共享中的任何東西) –

0

你可以也使用下面的方法:

public static String toString(List<?> list, String separator) { 
    StringBuilder sb = new StringBuilder(); 
    Iterator<?> it = list.iterator(); 
    while (it.hasNext()) { 
     Object next = it.next(); 
     sb.append(next); 
     if (it.hasNext()) { 
      sb.append(separator); 
     } 
    } 
    return sb.toString(); 
} 

增強for語句等價於一個基本for語句的形式爲:

for (I #i = Expression.iterator(); #i.hasNext();) { 
    VariableModifiersopt TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 

#i是自動生成標識符

1

只是爲了這裏的樂趣是一個不同的選擇。

StringBuilder builder = new StringBuilder(); 
    for (String s : list) { 
     builder.append(separator); 
     builder.append(s); 
    } 
    builder.deleteCharAt(0); 
    return builder.toString(); 
0

那麼,這將不會檢測循環中的第一次迭代,但解決問題。只需在每根弦的末尾附加分隔器並切斷最後一個分隔器。

StringBuilder builder = new StringBuilder() ; 

for (String s : list) { 
    builder.append(s) ;   
    builder.append(separator); 
} 
builder.setLength(builder.length() - separator.length()); 
return builder.toString() ; 
0

你可以試試這個:)

int i = 0; 
for (something : manythings) { 
    i++; 
} 
1

的Java 8解決方案

如果你有Java的8個可用的,你可以簡單地使用String#join,無需番石榴:

String.join(", ", list) 
相關問題