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

对于这种情况,一种更简单的方法是注意您始终可以附加一个空字符串:

// 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”场景几乎总是针对这个要求给出的——所以只需使用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

在您引用的特定情况下,请使用 Guava 的Joiner而不是自己滚动...

用分隔符连接文本片段(指定为数组、Iterable、可变参数或什至 Map)的对象。它要么将结果附加到 Appendable,要么将它们作为字符串返回。例子:

Joiner joiner = Joiner.on(separator).skipNulls();
return joiner.join(list);
于 2012-05-08T16:28:00.660 回答
3

Java 8 解决方案

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

String.join(", ", list)
于 2016-10-27T13:21:41.813 回答
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 回答
0

好吧,这不会检测循环中的第一次迭代,但可以解决问题。只需在每个字符串的末尾附加分隔符并切断最后一个分隔符。

StringBuilder builder = new StringBuilder() ;

for ( String s : list ) {
    builder.append(s) ;         
    builder.append(separator);
}
builder.setLength(builder.length() - separator.length());
return builder.toString() ;
于 2014-01-16T12:27:17.757 回答