在进行简单的文本处理和打印语句时,我经常遇到这种情况:循环遍历集合并对最后一个元素进行特殊处理(例如,除了最后一个元素以外,每个普通元素都会用逗号分隔)。
有没有一些最佳实践习惯或优雅的形式,不需要复制代码或将 if else 语句嵌入循环中。
例如,我有一个字符串列表,我想以逗号分隔的列表形式打印出来。(do while 解决方案已经假定列表有两个或更多元素,否则与条件正确的 for 循环一样糟糕)。
例如 List = ("dog", "cat", "bat")
我想打印“[dog,cat,bat]”
我提供了两种方法:
带条件的 for 循环
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; }
使用do while循环时为循环做准备
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;
}
测试类:
public static void main(String[] args) {
String[] items = { "dog", "cat", "bat" };
System.out.println(forLoopConditional(items));
System.out.println(doWhileLoopPrime(items));
}
在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(", ");
}
}
[ while(all) $value if(not_last) $separator ]
的习惯用法。 - corsiKa