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?
źródło
Odpowiedzi:
Java 8 i nowsze
Korzystanie z
StringJoiner
klasy:Korzystanie
Stream
iCollectors
:Java 7 i starsze
Zobacz także # 285523
źródło
źródło
Java 8 udostępnia kilka nowych sposobów, aby to zrobić:
join
Metoda naString
.joining
Kolektor dla strumieni zCollectors
klasą.StringJoiner
Klasa.Przykład:
Podejście wykorzystujące strumienie zakłada
import static java.util.stream.Collectors.joining;
.źródło
Stolarz .
źródło
Jeśli używasz Spring Framework, możesz to zrobić za pomocą StringUtils :
źródło
Na podstawie implementacji List toString w Javie:
Używa gramatyki takiej jak ta:
Opierając się na ostatniej zamiast na pierwszej, może sprawdzić, czy nie ma przecinka z pominięciem tego samego testu, aby sprawdzić koniec listy. Myślę, że ten jest bardzo elegancki, ale nie jestem pewien co do przejrzystości.
źródło
źródło
Jest na to ładny sposób za pomocą Java 8:
źródło
źródło
Jedną z opcji pętli foreach jest:
źródło
Aktualizacja : Jak wspomniał Dave Webb w komentarzach, może to nie dawać poprawnych wyników, jeśli pierwsze pozycje na liście to puste ciągi.
źródło
Zwykle robię to:
Chociaż myślę, że od teraz będę sprawdzał to zgodnie z implementacją Java;)
źródło
Jeśli możesz użyć Groovy (który działa na JVM):
źródło
(Skopiuj moją własną odpowiedź stąd .) Wiele z opisanych tutaj rozwiązań jest nieco przesadzonych, IMHO, zwłaszcza te, które opierają się na bibliotekach zewnętrznych. Istnieje ładny, przejrzysty idiom do tworzenia listy oddzielonej przecinkami, którego zawsze używałem. Opiera się na operatorze warunkowym (?):
Edycja : Oryginalne rozwiązanie poprawne, ale według komentarzy nieoptymalne. Próbuję po raz drugi:
Proszę bardzo, w 4 wierszach kodu, w tym deklaracja tablicy i StringBuilder.
2. edycja : Jeśli masz do czynienia z Iteratorem:
źródło
Zwykle używam czegoś podobnego do wersji 3. Działa dobrze c / c ++ / bash / ...: P
źródło
Nie skompilowałem tego ... ale powinno działać (lub być blisko pracy).
źródło
To jest bardzo krótkie, bardzo jasne, ale daje mojej wrażliwości pełzające okropności. Trochę niewygodne jest również dostosowanie się do różnych ograniczników, zwłaszcza jeśli jest to ciąg (nie znak).
Zainspirowany: Ostatnia iteracja ulepszonej pętli for w Javie
źródło
źródło
Item1Item2, Item3, Item4,
Trochę mi się podoba to podejście, które jakiś czas temu znalazłem na blogu. Niestety nie pamiętam nazwy / adresu URL bloga.
Możesz utworzyć klasę narzędziową / pomocniczą, która wygląda następująco:
Korzystanie z klasy pomocnika jest proste:
źródło
Ponieważ separatorem jest „”, możesz użyć dowolnego z poniższych:
Jeśli Twoim ogranicznikiem jest Cokolwiek innego, to nie zadziała.
źródło
Podoba mi się to rozwiązanie:
Zakładam, że może też wykorzystać StringBuilder.
źródło
Moim zdaniem najłatwiej to przeczytać i zrozumieć:
źródło
W Pythonie jest to łatwe
„,”. dołącz (twoja lista)
W języku C # w klasie String istnieje metoda statyczna
String.Join (",", yourlistofstrings)
Przepraszam, nie jestem pewien co do Javy, ale pomyślałem, że spytam, gdy pytasz o inne języki. Jestem pewien, że coś podobnego byłoby w Javie.
źródło
Możesz także bezwarunkowo dodać ciąg separatora, a po pętli usunąć dodatkowy separator na końcu. Wtedy „jeśli lista jest pusta, to zwróć ten ciąg” na początku pozwoli ci uniknąć sprawdzania na końcu (ponieważ nie możesz usunąć znaków z pustej listy)
Więc tak naprawdę pytanie brzmi:
„Biorąc pod uwagę pętlę i„ jeśli ”, jak myślisz, jaki jest najlepszy sposób na połączenie tych elementów?
źródło
źródło
listToString.substring(0, listToString.length()-separator.length());
Oparty na najjaśniejszym sposobie rozdzielania listy przecinkami (Java)?
Posługując się tym pomysłem: czy ostatni element w pętli zasługuje na osobne potraktowanie?
źródło
for (int i=0; i<1; i++)
naif (array.length>0)
.źródło
Żadna z odpowiedzi nie używa dotychczas rekursji ...
źródło
źródło
metoda
Stosowanie
Biorąc pod uwagę tablicę [1, 2, 3]
źródło