Best Loop Idiom für spezielle Gehäuse das letzte Element

Ich stoße bei einfachen Textverarbeitungs- und Druckanweisungen häufig auf diesen Fall, wenn ich eine Sammlung durchlaufe und das letzte Element in einem Sonderfall darstellen möchte (z. B. wird jedes normale Element mit Ausnahme des letzten durch Kommas getrennt). .

Gibt es eine Best-Practice-Sprache oder eine elegante Form, bei der kein Code dupliziert oder ein if eingefügt werden muss, ansonsten in der Schleife?

Zum Beispiel habe ich eine Liste von Zeichenfolgen, die ich in einer durch Kommas getrennten Liste drucken möchte. (Die do while-Lösung geht bereits davon aus, dass die Liste zwei oder mehr Elemente enthält. Andernfalls wäre sie genauso schlecht wie die korrektere for-Schleife mit conditional.)

z.B. List = ("Hund", "Katze", "Fledermaus")

Ich möchte "[Hund, Katze, Fledermaus]" drucken

Ich präsentiere 2 Methoden die

For Schleife mit bedingtem

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-Schleife bereitet die Schleife vor

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;
}

Testklasse:

public static void main(String[] args) {
    String[] items = { "dog", "cat", "bat" };

    System.out.println(forLoopConditional(items));
    System.out.println(doWhileLoopPrime(items));

}

In der Java AbstractCollection-Klasse hat sie die folgende Implementierung (etwas ausführlich, da sie alle Fehlerprüfungen für Kantenfälle enthält, aber nicht schlecht).

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(", ");
}
}

Antworten auf die Frage(36)

Ihre Antwort auf die Frage