Jaki jest najbardziej przejrzysty sposób rozdzielania listy przecinkami w Javie?
Znam kilka sposobów na zrobienie tego, ale zastanawiam się, jaki jest najlepszy (gdzie „najlepszy” oznacza najwyraźniejszy i / lub najkrótszy, a nie najskuteczniejszy.
Mam listę i chcę ją zapętlić, wypisując każdą wartość. Chcę wydrukować przecinek między każdą pozycją, ale nie po ostatniej (ani przed pierwszą).
List --> Item ( , Item ) *
List --> ( Item , ) * Item
Przykładowe rozwiązanie 1:
boolean isFirst = true;
for (Item i : list) {
if (isFirst) {
System.out.print(i); // no comma
isFirst = false;
} else {
System.out.print(", "+i); // comma
}
}
Przykładowe rozwiązanie 2 - utwórz podlistę:
if (list.size()>0) {
System.out.print(list.get(0)); // no comma
List theRest = list.subList(1, list.size());
for (Item i : theRest) {
System.out.print(", "+i); // comma
}
}
Przykładowe rozwiązanie 3:
Iterator<Item> i = list.iterator();
if (i.hasNext()) {
System.out.print(i.next());
while (i.hasNext())
System.out.print(", "+i.next());
}
Te pierwsze traktują specjalnie; można zamiast tego potraktować specjalnie ostatnią osobę.
Nawiasem mówiąc, oto jak List
toString
jest zaimplementowany (jest dziedziczony z AbstractCollection
), w Javie 1.6:
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(", ");
}
}
Wcześniej wychodzi z pętli, aby uniknąć przecinka po ostatnim elemencie. Przy okazji: po raz pierwszy widzę „(tę kolekcję)”; oto kod, który to sprowokuje:
List l = new LinkedList();
l.add(l);
System.out.println(l);
Z zadowoleniem przyjmuję każde rozwiązanie, nawet jeśli używają nieoczekiwanych bibliotek (regexp?); a także rozwiązania w językach innych niż Java (np myślę Python / Ruby mają przeplatać funkcji - jak to jest , że ? zaimplementowane).
Wyjaśnienie : przez biblioteki mam na myśli standardowe biblioteki Java. W przypadku innych bibliotek rozważam je w innych językach i interesuje mnie, jak są zaimplementowane.
Zestaw narzędzi EDIT wspomniał o podobnym pytaniu: Ostatnia iteracja ulepszonej pętli for w java
I jeszcze: czy ostatni element w pętli zasługuje na osobne potraktowanie?