2012-05-08 98 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) 
相关问题