Dou*_*kem 48 java loops idioms while-loop
我在做简单的文本处理和打印语句时经常遇到这种情况,我循环一个集合,我想要特殊情况下的最后一个元素(例如,除了最后一个例子,每个普通元素都将以逗号分隔).
是否有一些最佳实践习惯或优雅的形式,不需要复制代码或在if循环中推..
例如,我有一个字符串列表,我想在逗号分隔列表中打印.(虽然解决方案已经假设列表中有2个或更多元素,否则它就像使用条件的更正确的循环一样糟糕).
例如List =("dog","cat","bat")
我想打印"[狗,猫,蝙蝠]"
我提出了两种方法
对于有条件的循环
public static String forLoopConditional(String[] items) {
String itemOutput = "[";
for (int i = 0; i < items.length; i++) {
// Check if we're not at the last element
if (i < (items.length - 1)) {
itemOutput += items[i] + ", ";
} else {
// last element
itemOutput += items[i];
}
}
itemOutput += "]";
return itemOutput;
}
Run Code Online (Sandbox Code Playgroud)做循环启动循环
public static String doWhileLoopPrime(String[] items) {
String itemOutput = "[";
int i = 0;
itemOutput += items[i++];
if (i < (items.length)) {
do {
itemOutput += ", " + items[i++];
} while (i < items.length);
}
itemOutput += "]";
return itemOutput;
}
Run Code Online (Sandbox Code Playgroud)
测试者类:
public static void main(String[] args) {
String[] items = { "dog", "cat", "bat" };
System.out.println(forLoopConditional(items));
System.out.println(doWhileLoopPrime(items));
}
Run Code Online (Sandbox Code Playgroud)在Java AbstractCollection类中,它具有以下实现(有点冗长,因为它包含所有边缘大小写错误检查,但也不错).
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
Run Code Online (Sandbox Code Playgroud)
fin*_*nnw 43
我通常这样写:
static String commaSeparated(String[] items) {
StringBuilder sb = new StringBuilder();
String sep = "";
for (String item: items) {
sb.append(sep);
sb.append(item);
sep = ",";
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
gk5*_*885 24
这些答案中有很多for循环,但我发现Iterator和while循环更容易读取.例如:
Iterator<String> itemIterator = Arrays.asList(items).iterator();
if (itemIterator.hasNext()) {
// special-case first item. in this case, no comma
while (itemIterator.hasNext()) {
// process the rest
}
}
Run Code Online (Sandbox Code Playgroud)
这是Joiner在Google集合中采用的方法,我发现它非常易读.
Jer*_*ing 14
string value = "[" + StringUtils.join( items, ',' ) + "]";
Run Code Online (Sandbox Code Playgroud)
小智 7
我通常的做法是测试索引变量是否为零,例如:
var result = "[ ";
for (var i = 0; i < list.length; ++i) {
if (i != 0) result += ", ";
result += list[i];
}
result += " ]";
Run Code Online (Sandbox Code Playgroud)
但是,当然,只有当我们谈论没有一些Array.join(",")方法的语言时才会这样.;-)
我认为将第一个元素视为特殊情况更容易,因为更容易知道迭代是第一个而不是最后一个.它不需要任何复杂或昂贵的逻辑来知道第一次是否正在做某事.
public static String prettyPrint(String[] items) {
String itemOutput = "[";
boolean first = true;
for (int i = 0; i < items.length; i++) {
if (!first) {
itemOutput += ", ";
}
itemOutput += items[i];
first = false;
}
itemOutput += "]";
return itemOutput;
}
Run Code Online (Sandbox Code Playgroud)