26

文字で区切られたリストをクライアントに返すサーバーで作業しています。これらのリストを作成するには、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() ;

フラグなしでこれを行う方法はありますか?

4

9 に答える 9

20

この状況の 1 つの簡単な方法は、いつでも空の文字列を追加できることに注意することです。

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

代わりに(そしてできれば)グアバのJoinerクラスを使用して開始します:)

この「ジョイナー」シナリオは、ほとんどの場合、この要件に対して与えられるシナリオですJoiner。他のシナリオでは、通常のforループを使用するか、コードに従って条件を使用します。

于 2012-05-08T16:26:57.850 に答える
7

foreach を使用するのではなく、反復子を手動で使用します。

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

(ところで、これは Guava の Joiner クラスが内部で行っていることとほぼ同じですが、より高いレベルではあります)

于 2012-05-08T16:27:48.053 に答える
3

あなたが引用する特定のケースでは、独自のロールの代わりにグアバのジョイナーを使用してください...

テキストの断片 (配列、Iterable、vararg、または Map として指定) をセパレーターで結合するオブジェクト。結果を Appendable に追加するか、文字列として返します。例:

Joiner joiner = Joiner.on(separator).skipNulls();
return joiner.join(list);
于 2012-05-08T16:28:00.660 に答える
1

ここでの楽しみのためだけに、別のオプションがあります。

    StringBuilder builder = new StringBuilder();
    for (String s : list) {
        builder.append(separator);
        builder.append(s);
    }
    builder.deleteCharAt(0);
    return builder.toString();
于 2012-05-08T17:47:00.940 に答える
1

これを試すことができます:)

int i = 0;
for (something : manythings) {
    i++;
}
于 2016-08-10T15:27:30.900 に答える
0

commons.lang StringUtils.join 関数を使用します ( http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.htmlを参照)。車輪の再発明を避けるために、このライブラリや他のヘルパー ライブラリに精通することを強くお勧めします。

于 2012-05-08T16:29:50.310 に答える
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自動生成された識別子です

于 2012-05-08T17:20:36.313 に答える