Czy istnieje sposób, aby określić, czy pętla jest iterowana po raz ostatni. Mój kod wygląda mniej więcej tak:
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
for(int i : array)
{
builder.append("" + i);
if(!lastiteration)
builder.append(",");
}
Chodzi o to, że nie chcę dodawać przecinka w ostatniej iteracji. Czy jest teraz sposób, aby określić, czy jest to ostatnia iteracja, czy też utknąłem w pętli for lub używając zewnętrznego licznika do śledzenia.
java
for-loop
foreach
conditional-execution
Rtęciowy
źródło
źródło
Odpowiedzi:
Inną alternatywą jest dołączenie przecinka przed dodaniem i, ale nie w pierwszej iteracji. (Nawiasem
"" + i
mówiąc, proszę nie używać - tak naprawdę nie chcesz tutaj konkatenacji, a StringBuilder ma doskonale dobre przeciążenie append (int).)Fajną rzeczą w tym jest to, że będzie działać z każdym
Iterable
- nie zawsze możesz indeksować rzeczy. („Dodaj przecinek, a następnie usuń go na końcu” to dobra sugestia, gdy naprawdę używasz StringBuilder - ale nie działa w przypadku takich rzeczy, jak pisanie do strumieni. Jest to jednak prawdopodobnie najlepsze podejście do tego konkretnego problemu. )źródło
isFirst
flagi logicznej. Bonus: także szybciej.Inny sposób na zrobienie tego:
Aktualizacja: dla Java 8 masz teraz Kolektory
źródło
Łatwiej będzie zawsze dołączać. A potem, kiedy skończysz z pętlą, po prostu usuń ostatni znak. W ten sposób też ton mniej warunkowych.
Można użyć
StringBuilder
„sdeleteCharAt(int index)
z indeksu samopoczucialength() - 1
źródło
Może używasz złego narzędzia do pracy.
To jest bardziej ręczne niż to, co robisz, ale jest w pewnym sensie bardziej eleganckie, jeśli nie trochę „oldschoolowe”
źródło
To prawie powtórzenie tego pytania StackOverflow . To, czego chcesz, to StringUtils i wywołanie metody join .
źródło
Inne rozwiązanie (być może najbardziej wydajne)
źródło
zachowaj prostotę i użyj standardu pętli:
lub po prostu użyj apache commons-lang StringUtils.join ()
źródło
Jawne pętle zawsze działają lepiej niż niejawne.
Powinieneś owinąć całość w instrukcję if, na wypadek gdybyś miał do czynienia z tablicą o zerowej długości.
źródło
Jeśli przekonwertujesz go na klasyczną pętlę indeksu, tak.
Lub możesz po prostu usunąć ostatni przecinek po zakończeniu. Tak jak to:
Ja, po prostu używam
StringUtils.join()
ze wspólnego języka .źródło
Potrzebujesz separatora klas .
Implementacja klasy
Separator
jest prosta. Zawija ciąg, który jest zwracany przy każdym wywołaniu ztoString()
wyjątkiem pierwszego wywołania, które zwraca pusty łańcuch.źródło
Oparty na java.util.AbstractCollection.toString (), kończy działanie wcześnie, aby uniknąć separatora.
Jest skuteczny i elegancki, ale nie jest tak oczywisty, jak niektóre inne odpowiedzi.
źródło
(! i.hasNext())
, co jest ważną częścią solidności całego podejścia. (Inne rozwiązania tutaj z wdziękiem radzą sobie z pustymi kolekcjami, więc twoje też powinny! :)Oto rozwiązanie:
Poszukaj pierwszej iteracji :)
źródło
Jak wspomniano w zestawie narzędzi, w Javie 8 mamy teraz Kolektory . Oto jak wyglądałby kod:
Myślę, że robi dokładnie to, czego szukasz, i jest to wzór, którego możesz użyć do wielu innych rzeczy.
źródło
Jeszcze inna opcja.
źródło
Wiele z opisanych tutaj rozwiązań jest nieco przesadzonych, IMHO, zwłaszcza te, które opierają się na bibliotekach zewnętrznych. Istnieje ładny, czysty i 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.
źródło
Oto test porównawczy SSCCE, który przeprowadziłem (związany z tym, co musiałem zaimplementować) z następującymi wynikami:
Przynajmniej na moim przykładzie pomijanie sprawdzania przy każdej iteracji nie jest zauważalnie szybsze, szczególnie w przypadku rozsądnych ilości danych, ale tak jest szybsze.
źródło
Innym podejściem jest przechowywanie długości tablicy (jeśli jest dostępna) w oddzielnej zmiennej (bardziej wydajne niż ponowne sprawdzanie długości za każdym razem). Następnie możesz porównać swój indeks z tą długością, aby określić, czy dodać ostatni przecinek.
EDYCJA: Inną kwestią jest rozważenie kosztu wydajności usunięcia ostatniego znaku (który może spowodować kopię ciągu) z koniecznością sprawdzania warunku w każdej iteracji.
źródło
Jeśli zamieniasz tablicę tylko w tablicę rozdzielaną przecinkami, wiele języków ma właśnie do tego funkcję łączenia. Zamienia tablicę w ciąg z ogranicznikiem między każdym elementem.
źródło
W tym przypadku naprawdę nie ma potrzeby wiedzieć, czy jest to ostatnie powtórzenie. Jest wiele sposobów rozwiązania tego problemu. Jednym ze sposobów byłoby:
źródło
Tutaj dwie alternatywne ścieżki:
1: Narzędzia ciągów znaków Apache Commons
2: Zachowaj wywołanie logiczne
first
, ustaw na true. W każdej iteracji, jeślifirst
jest fałszywe, dołącz przecinek; po tym ustawfirst
na false.źródło
Ponieważ jest to stała tablica, łatwiej byłoby po prostu uniknąć ulepszonego for ... Jeśli obiekt jest zbiorem, iterator byłby łatwiejszy.
źródło