Apakah ada cara untuk menentukan apakah loop itu berulang untuk terakhir kalinya. Kode saya terlihat seperti ini:
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
for(int i : array)
{
builder.append("" + i);
if(!lastiteration)
builder.append(",");
}
Sekarang masalahnya adalah saya tidak ingin menambahkan koma di iterasi terakhir. Sekarang apakah ada cara untuk menentukan apakah itu adalah iterasi terakhir atau saya terjebak dengan for loop atau menggunakan penghitung eksternal untuk melacak.
java
for-loop
foreach
conditional-execution
Berbelas kasihan
sumber
sumber
Jawaban:
Alternatif lain adalah menambahkan koma sebelum Anda menambahkan saya, hanya saja tidak pada iterasi pertama . (Tolong, jangan gunakan
"" + i
- Anda tidak benar-benar ingin penggabungan di sini, dan StringBuilder memiliki kelebihan (int) append yang sangat baik.)Yang menyenangkan tentang ini adalah bahwa itu akan bekerja dengan apa pun
Iterable
- Anda tidak selalu dapat mengindeks hal-hal. ("Tambahkan koma dan kemudian hapus di bagian akhir" adalah saran yang bagus ketika Anda benar-benar menggunakan StringBuilder - tetapi itu tidak berfungsi untuk hal-hal seperti menulis ke stream. Ini mungkin merupakan pendekatan terbaik untuk masalah yang tepat ini. )sumber
isFirst
bendera boolean. Bonus: lebih cepat juga.Cara lain untuk melakukan ini:
Pembaruan: Untuk Java 8, Anda sekarang memiliki Kolektor
sumber
Mungkin lebih mudah untuk selalu menambahkan. Dan kemudian, ketika Anda selesai dengan loop Anda, hapus saja karakter terakhir. Ton kondisional kurang seperti itu juga.
Anda dapat menggunakan
StringBuilder
'sdeleteCharAt(int index)
dengan indeks makhluklength() - 1
sumber
Mungkin Anda menggunakan alat yang salah untuk Ayub.
Ini lebih manual daripada apa yang Anda lakukan tetapi dengan cara yang lebih elegan jika tidak sedikit "jadul"
sumber
Ini hampir merupakan pengulangan dari pertanyaan StackOverflow ini . Yang Anda inginkan adalah StringUtils , dan untuk memanggil metode join .
sumber
Solusi lain (mungkin yang paling efisien)
sumber
tetap sederhana dan gunakan standar untuk loop:
atau cukup gunakan apache commons-lang StringUtils.join ()
sumber
Loop eksplisit selalu bekerja lebih baik daripada yang implisit.
Anda harus membungkus semuanya dalam if-statement untuk berjaga-jaga jika Anda berurusan dengan array panjang nol.
sumber
Jika Anda mengonversinya ke loop indeks klasik, ya.
Atau Anda bisa menghapus koma terakhir setelah selesai. Seperti itu:
Saya, saya hanya menggunakan
StringUtils.join()
dari commons-lang .sumber
Anda membutuhkan Pemisah Kelas .
Implementasi kelas
Separator
lurus ke depan. Itu membungkus string yang dikembalikan pada setiap panggilantoString()
kecuali untuk panggilan pertama, yang mengembalikan string kosong.sumber
Berdasarkan java.util.AbstractCollection.toString (), ia keluar lebih awal untuk menghindari pembatas.
Ini efisien dan elegan, tetapi tidak terbukti dengan sendirinya seperti beberapa jawaban lainnya.
sumber
(! i.hasNext())
, yang merupakan bagian penting dari kekokohan pendekatan keseluruhan. (Solusi lain di sini menangani koleksi kosong dengan anggun, jadi milik Anda juga harus :) :)Ini solusinya:
Cari iterasi pertama :)
sumber
Seperti yang disebutkan dalam toolkit, di Java 8 kami sekarang memiliki Kolektor . Seperti apa kode ini nantinya:
Saya pikir itu tepat apa yang Anda cari, dan itu pola yang bisa Anda gunakan untuk banyak hal lainnya.
sumber
Namun pilihan lain.
sumber
Banyak solusi yang dijelaskan di sini sedikit berlebihan, IMHO, terutama yang bergantung pada perpustakaan eksternal. Ada ungkapan bersih dan jelas yang bagus untuk mencapai daftar yang dipisahkan koma yang selalu saya gunakan. Itu bergantung pada operator bersyarat (?):
Sunting : Solusi asli yang benar, tetapi tidak optimal menurut komentar. Mencoba yang kedua kalinya:
Ini dia, dalam 4 baris kode termasuk deklarasi array dan StringBuilder.
sumber
Inilah patokan SSCCE yang saya jalankan (terkait dengan apa yang harus saya terapkan) dengan hasil ini:
Pada contoh saya setidaknya, melompat-lompat cek pada setiap iterasi tidak terasa lebih cepat terutama untuk volume waras data, tetapi adalah lebih cepat.
sumber
Pendekatan lain adalah memiliki panjang array (jika tersedia) disimpan dalam variabel yang terpisah (lebih efisien daripada memeriksa ulang panjang setiap kali). Anda kemudian dapat membandingkan indeks Anda dengan panjang itu untuk menentukan apakah akan menambahkan koma akhir atau tidak.
EDIT: Pertimbangan lain adalah menimbang biaya kinerja menghapus karakter akhir (yang dapat menyebabkan salinan string) agar tidak bersyarat diperiksa di setiap iterasi.
sumber
Jika Anda hanya mengubah array menjadi array yang dibatasi koma, banyak bahasa memiliki fungsi gabungan untuk hal ini. Ini mengubah array menjadi string dengan pembatas antara setiap elemen.
sumber
Dalam hal ini benar-benar tidak perlu tahu apakah ini adalah pengulangan terakhir. Ada banyak cara untuk menyelesaikannya. Salah satu caranya adalah:
sumber
Dua jalur alternatif di sini:
1: Utilitas String Apache Commons
2: Tetap memanggil boolean
first
, atur true. Dalam setiap iterasi, jikafirst
salah, tambahkan koma Anda; setelah itu, setelfirst
ke false.sumber
Karena ini adalah array tetap, akan lebih mudah hanya untuk menghindari peningkatan untuk ... Jika Objek adalah kumpulan, maka iterator akan lebih mudah.
sumber