簡體   English   中英

通過Java中的for-each循環檢測第一次迭代

[英]Detecting the first iteration through a for-each loop in 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() ;

沒有旗幟,有沒有辦法做到這一點?

對於這種情況,一種更簡單的方法是注意你總是可以附加一個空字符串:

// 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;
}

或者(並且最好)使用Guava的Joiner類來開始:)

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

不使用foreach,而是手動使用迭代器:

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

(順便說一句,這幾乎是Guava的Joiner課程在內部所做的,盡管在更高的層次上)

在你引用的特定情況下,使用Guava的Joiner而不是自己滾動......

用分隔符連接文本(指定為數組,Iterable,varargs甚至Map)的對象。 它將結果附加到Appendable或將它們作為String返回。 例:

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

Java 8解決方案

如果你有Java 8可用,你可以簡單地使用String#join ,不需要Guava:

String.join(", ", list)

只是為了這里的樂趣是一個不同的選擇。

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

你可以嘗試這個:)

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

我會使用commons.lang StringUtils.join函數(參見http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html )。 我強烈建議您熟悉這個和其他幫助程序庫,以避免重新發明輪子。

您還可以使用以下方法:

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是自動生成的標識符

好吧,這不會檢測循環中的第一次迭代,但解決了問題。 只需將分隔符附加在每個字符串的末尾並切斷最后一個分隔符。

StringBuilder builder = new StringBuilder() ;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM