Я часто сталкиваюсь с этим случаем при выполнении простых операций обработки текста и печати, когда я перебираю цикл, и я хочу, чтобы в специальном случае был последний элемент (например, каждый нормальный элемент будет разделен запятой, за исключением последнего случай).
Есть ли какая-либо передовая практика идиома или элегантная форма, которая не требует дублирования кода или перетаскивания в if, else в цикле.
Например, у меня есть список строк, которые я хочу напечатать в списке, разделенном запятыми. (в то время как решение уже предполагает, что список имеет 2 или более элементов, в противном случае это было бы так же плохо, как более правильный для цикла с условным).
например. List = ( "собака", "кошка", "летучая мышь" )
Я хочу напечатать "[собака, кошка, летучая мышь]"
Я представляю 2 метода
-
Для цикла с условным
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(", ");
}
}