Apa cara paling jelas untuk memisahkan koma-batasi daftar di Java?
Saya tahu beberapa cara melakukannya, tetapi saya bertanya-tanya apa cara terbaik (di mana "terbaik" berarti paling jelas dan / atau terpendek, bukan yang paling efisien.
Saya memiliki daftar dan saya ingin mengulanginya, mencetak setiap nilai. Saya ingin mencetak koma di antara setiap item, tetapi tidak setelah yang terakhir (atau sebelum yang pertama).
List --> Item ( , Item ) *
List --> ( Item , ) * Item
Solusi sampel 1:
boolean isFirst = true;
for (Item i : list) {
if (isFirst) {
System.out.print(i); // no comma
isFirst = false;
} else {
System.out.print(", "+i); // comma
}
}
Solusi sampel 2 - buat sublist:
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
}
}
Solusi sampel 3:
Iterator<Item> i = list.iterator();
if (i.hasNext()) {
System.out.print(i.next());
while (i.hasNext())
System.out.print(", "+i.next());
}
Ini memperlakukan item pertama secara khusus; seseorang malah bisa memperlakukan yang terakhir secara khusus.
Kebetulan, di sini adalah bagaimana List
toString
yang dilaksanakan (itu diwarisi dari AbstractCollection
), di Java 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(", ");
}
}
Ini keluar dari loop lebih awal untuk menghindari koma setelah item terakhir. BTW: ini pertama kalinya saya ingat melihat "(Koleksi ini)"; berikut kode untuk memprovokasi itu:
List l = new LinkedList();
l.add(l);
System.out.println(l);
Saya menyambut baik solusi apapun, bahkan jika mereka menggunakan perpustakaan yang tidak terduga (regexp?); dan juga solusi dalam bahasa lain selain Java (misalnya saya pikir Python / Ruby memiliki menyelingi fungsi - bagaimana itu ? diimplementasikan).
Klarifikasi : menurut perpustakaan, yang saya maksud adalah perpustakaan Java standar. Untuk perpustakaan lain, saya mempertimbangkannya dengan bahasa lain, dan tertarik untuk mengetahui bagaimana penerapannya.
Toolkit EDIT menyebutkan pertanyaan serupa: iterasi terakhir untuk loop ditingkatkan di java
Dan lainnya: Apakah elemen terakhir dalam sebuah loop membutuhkan perlakuan terpisah?
sumber
Jawaban:
Java 8 dan yang lebih baru
Menggunakan
StringJoiner
kelas:Menggunakan
Stream
, danCollectors
:Java 7 dan sebelumnya
Lihat juga # 285523
sumber
sumber
Java 8 menyediakan beberapa cara baru untuk melakukan ini:
join
metode padaString
.joining
kolektor untuk aliran dariCollectors
kelas.StringJoiner
kelas.Contoh:
Pendekatan menggunakan aliran mengasumsikan
import static java.util.stream.Collectors.joining;
.sumber
Joiner .
sumber
Jika Anda menggunakan Spring Framework, Anda dapat melakukannya dengan StringUtils :
sumber
Berdasarkan implementasi List toString Java:
Ini menggunakan tata bahasa seperti ini:
Dengan menjadi berbasis terakhir dan bukan berbasis pertama, itu dapat memeriksa lewati-koma dengan tes yang sama untuk memeriksa akhir daftar. Saya pikir yang ini sangat elegan, tapi saya tidak yakin tentang kejelasannya.
sumber
sumber
Ada cara yang bagus untuk mencapai ini menggunakan Java 8:
sumber
sumber
Salah satu opsi untuk foreach loop adalah:
sumber
Pembaruan : Seperti yang disebutkan Dave Webb dalam komentar, ini mungkin tidak memberikan hasil yang benar jika item pertama dalam daftar adalah string kosong.
sumber
Saya biasanya melakukan ini:
Meskipun saya pikir saya akan memeriksa ini mulai sekarang sesuai dengan implementasi Java;)
sumber
Jika Anda dapat menggunakan Groovy (yang berjalan di JVM):
sumber
(Salin tempel jawaban saya sendiri dari sini .) Banyak solusi yang dijelaskan di sini agak berlebihan, IMHO, terutama yang mengandalkan pustaka eksternal. Ada ungkapan bagus yang bersih dan jelas untuk mencapai daftar yang dipisahkan koma yang selalu saya gunakan. Ini bergantung pada operator kondisional (?):
Sunting : Solusi asli benar, tetapi tidak optimal menurut komentar. Mencoba untuk kedua kalinya:
Ini dia, dalam 4 baris kode termasuk deklarasi array dan StringBuilder.
Edit kedua : Jika Anda berurusan dengan Iterator:
sumber
Saya biasanya menggunakan sesuatu yang mirip dengan versi 3. Ini bekerja dengan baik c / c ++ / bash / ...: P
sumber
Saya tidak mengkompilasinya ... tetapi harus bekerja (atau hampir bekerja).
sumber
Ini sangat singkat, sangat jelas, tetapi membuat perasaan saya kengerian yang merayap. Ini juga agak canggung untuk beradaptasi dengan pembatas yang berbeda, terutama jika sebuah String (bukan char).
Terinspirasi oleh: Iterasi terakhir for loop di java
sumber
sumber
Item1Item2, Item3, Item4,
Saya agak menyukai pendekatan ini, yang saya temukan di blog beberapa waktu lalu. Sayangnya saya tidak ingat nama / URL blog tersebut.
Anda dapat membuat kelas utilitas / pembantu yang terlihat seperti ini:
Menggunakan kelas helper sesederhana ini:
sumber
Karena pembatas Anda adalah "," Anda dapat menggunakan salah satu dari berikut ini:
Jika pembatas Anda ADA, maka ini tidak akan berhasil untuk Anda.
sumber
Saya suka solusi ini:
Saya berasumsi itu dapat menggunakan StringBuilder juga.
sumber
Menurut saya, ini yang paling sederhana untuk dibaca dan dipahami:
sumber
Dengan Python itu mudah
",". gabung (daftar Anda)
Di C # ada metode statis pada kelas String
String.Join (",", yourlistofstrings)
Maaf, tidak yakin tentang Java tapi saya pikir saya akan melanjutkannya saat Anda bertanya tentang bahasa lain. Saya yakin akan ada yang serupa di Jawa.
sumber
Anda juga dapat menambahkan pembatas tanpa syarat, dan setelah pengulangan menghapus pembatas ekstra di akhir. Kemudian "jika daftar kosong maka kembalikan string ini" di awal akan memungkinkan Anda untuk menghindari pemeriksaan di akhir (karena Anda tidak dapat menghapus karakter dari daftar kosong)
Jadi pertanyaannya sebenarnya adalah:
"Diberikan lingkaran dan jika, menurut Anda apa cara paling jelas untuk menggabungkan ini?"
sumber
sumber
listToString.substring(0, listToString.length()-separator.length());
Berdasarkan cara paling jelas untuk memisahkan koma daftar (Java)?
Menggunakan ide ini: Apakah elemen terakhir dalam sebuah loop layak mendapatkan perlakuan terpisah?
sumber
for (int i=0; i<1; i++)
menjadiif (array.length>0)
.sumber
Sejauh ini tidak ada jawaban yang menggunakan rekursi ...
sumber
sumber
metode
Pemakaian
Diberikan larik [1,2,3]
sumber