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