我正在处理一个将字符分隔列表返回给客户端的服务器。 为了构建这些列表,我必须通过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 :(得分: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
。对于其他方案,请使用常规for
循环或根据您的代码使用条件。
答案 1 :(得分:6)
不使用foreach,而是手动使用迭代器:
Iterator<String> it = list.iterator();
if(it.hasNext()){
doSomeThingForTheFirstTime(it.next());
while(it.hasNext()){
doSomethingElse(it.next);
}
}
(顺便说一下,这几乎是Guava的Joiner课程在内部所做的,不过更高层次)
答案 2 :(得分:3)
在你引用的特定情况下,使用Guava的Joiner而不是自己滚动......
使用分隔符连接文本(指定为数组,Iterable,varargs甚至Map)的对象。它将结果附加到Appendable或将它们作为String返回。例如:
Joiner joiner = Joiner.on(separator).skipNulls();
return joiner.join(list);
答案 3 :(得分:3)
答案 4 :(得分:1)
这里的乐趣只是一个不同的选择。
StringBuilder builder = new StringBuilder();
for (String s : list) {
builder.append(separator);
builder.append(s);
}
builder.deleteCharAt(0);
return builder.toString();
答案 5 :(得分:1)
你可以试试这个:)
int i = 0;
for (something : manythings) {
i++;
}
答案 6 :(得分:0)
我会使用commons.lang StringUtils.join函数(参见http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html)。我强烈建议您熟悉这个和其他帮助程序库,以避免重新发明轮子。
答案 7 :(得分: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
是自动生成的标识符
答案 8 :(得分:0)
好吧,这不会检测循环中的第一次迭代,但解决了问题。只需将分隔符附加在每个字符串的末尾并切断最后一个分隔符。
StringBuilder builder = new StringBuilder() ;
for ( String s : list ) {
builder.append(s) ;
builder.append(separator);
}
builder.setLength(builder.length() - separator.length());
return builder.toString() ;