Lebih tepatnya: StringBuffer untuk jdk1.4 dan yang lebih lama, StringBuilder untuk jdk1.5 dan setelahnya, karena yang terakhir tidak disinkronkan, karenanya sedikit lebih cepat.
VonC
2
Alih-alih dua pemanggilan iter.hasNext () Saya biasanya menambahkan delimeter dan kemudian "return buf.substring (0, buf.length () - delimeter.length ())".
Vilmantas Baranauskas
2
Anda dapat menyederhanakannya sedikit dengan keluar lebih awal untuk menghindari pembatas: while (true) (add_iter; if (! Iter.hasNext ()) break; add_delim;}
Untuk bergabung, saya yakin ini mungkin terlihat sedikit lebih mudah:
publicStringjoin(Collection<String> c){StringBuilder sb=newStringBuilder();for(String s: c)
sb.append(s);return sb.toString();}
Saya tidak bisa menggunakan sintaks Java 5 sebanyak yang saya inginkan (Percaya atau tidak, saya telah menggunakan 1.0.x akhir-akhir ini) jadi saya mungkin agak berkarat, tapi saya yakin konsepnya benar .
edit tambahan: Penambahan string bisa lambat, tetapi jika Anda bekerja pada kode GUI atau beberapa rutinitas yang berjalan singkat, tidak masalah jika Anda mengambil .005 detik atau .006, jadi jika Anda memiliki koleksi yang disebut "joinMe" yang ingin Anda tambahkan ke string "target" yang ada, tidak akan mengerikan jika hanya sebaris ini:
for(String s : joinMe)
target += s;
Ini cukup tidak efisien (dan kebiasaan buruk), tetapi tidak apa pun yang dapat Anda lihat kecuali ada ribuan string atau ini ada di dalam lingkaran besar atau kode Anda benar-benar penting untuk performa.
Lebih penting lagi, mudah diingat, singkat, cepat dan sangat mudah dibaca. Performa tidak selalu menjadi pemenang otomatis dalam pilihan desain.
Perulangan-ke benar, tetapi Anda juga harus membuatnya menjadi Collection <String>. Jika tidak, Anda harus mengatakan "untuk (Objek o: c)", karena Anda tidak dapat menjamin bahwa semua yang ada di c adalah String.
Michael Myers
Poin bagus, saya bahkan lebih berkarat dengan Generik. Saya akan mengeditnya.
Bill K
Saat menggabungkan inline: string + string + string, compiler sebenarnya menggunakan StringBuilder untuk menambahkan nilai. Saya ingin tahu apakah dalam metode for-loop Anda memiliki yang kedua di sana, apakah kompiler akan melakukan hal yang sama.
Spencer Kormos
@ Spencer K: Ini memang menggunakan StringBuilder, tetapi membuat yang baru untuk setiap iterasi (bukan metode yang paling efisien, tapi bagaimana kompiler seharusnya mengetahuinya?). Saya tidak tahu apakah compiler JIT dapat mengoptimalkannya pada saat runtime.
Michael Myers
2
Oh tunggu. Apakah Anda berbicara + =? Ya, itu menyebalkan. Loop dan menambahkan saat ini dalam jawaban saya menggunakan StringBuilder dan itulah yang saya bicarakan. Meskipun + = telah meningkat pesat, Anda benar-benar tidak ingin menggunakannya di dalam loop - tidak terlalu banyak yang buggy tetapi dapat berfungsi seperti omong kosong (Bug bukan istilah yang umumnya digunakan untuk masalah kinerja - setidaknya tidak dalam 20 tahun pemrograman saya). Juga JIT dapat meningkatkan ini dengan sangat - tetapi saya tidak akan mengandalkan itu.
Bill K
4
Inilah jawaban yang cukup sederhana. Gunakan +=karena ini lebih sedikit kode dan biarkan pengoptimal mengubahnya menjadi StringBuilderuntuk Anda. Dengan menggunakan metode ini, Anda tidak perlu melakukan pemeriksaan "terakhir" di loop Anda (peningkatan kinerja) dan Anda tidak perlu khawatir tentang menghapus pembatas apa pun di akhir.
Solusi yang sangat elegan, tidak melibatkan perpustakaan pihak ketiga!
Denis Itskovich
2
Saya tidak ingin mengimpor seluruh pustaka Apache untuk menambahkan fungsi gabungan sederhana, jadi inilah retasan saya.
publicStringjoin(String delim,List<String> destinations){StringBuilder sb =newStringBuilder();int delimLength = delim.length();for(String s: destinations){
sb.append(s);
sb.append(delim);}// we have appended the delimiter to the end // in the previous for-loop. Let's now remove it.if(sb.length()>= delimLength){return sb.substring(0, sb.length()- delimLength);}else{return sb.toString();}}
@MrSnowflake Apakah pembuat string standar memiliki metode "removeCharAt (int index)" Ini tidak muncul pada versi yang saya jalankan
NSjonas
@NSjonas - ya suntingannya atas jawaban saya salah. Tidak removeCharAtada, dan seluruh fungsi tidak lagi mengembalikan String ... Akan memperbaiki ini.
Martin Konecny
sementara Anda melakukannya ... solusi saat ini akan menampilkan "indeks di luar batas pengecualian jika Anda meneruskan dalam Daftar kosong"
NSjonas
melakukan edit untuk memangkas panjang yang tepat jika pembatas lebih dari 1 karakter. Juga memperbaiki masalah di mana Anda memangkas karakter terakhir dan bukan yang pertama seperti yang benar-benar Anda perlukan
NSjonas
Terima kasih atas umpan baliknya. Diperbarui.
Martin Konecny
1
Jika Anda ingin menggabungkan (menggabungkan) beberapa string menjadi satu, Anda harus menggunakan StringBuilder. Ini jauh lebih baik daripada menggunakan
for(String s : joinMe)
target += s;
Ada juga sedikit kinerja menang atas StringBuffer, karena StringBuilder tidak menggunakan sinkronisasi.
Untuk metode utilitas tujuan umum seperti ini, metode ini (pada akhirnya) akan dipanggil berkali-kali dalam banyak situasi, jadi Anda harus membuatnya efisien dan tidak mengalokasikan banyak objek sementara. Kami telah membuat profil banyak, banyak aplikasi Java yang berbeda dan hampir selalu menemukan bahwa penggabungan string dan alokasi string / char [] membutuhkan banyak waktu / memori.
Metode collection -> string kami yang dapat digunakan kembali pertama-tama menghitung ukuran hasil yang diperlukan dan kemudian membuat StringBuilder dengan ukuran awal tersebut; ini menghindari penggandaan / penyalinan karakter internal [] yang tidak perlu yang digunakan saat menambahkan string.
re: ukuran yang dihitung sebelumnya: Jika berhasil, itu bagus. Itu tidak selalu memungkinkan. Saya ingat pernah membaca di suatu tempat bahwa menggandakan ukuran buffer setiap kali (atau benar-benar mengalikan dengan faktor tetap) memberikan sesuatu seperti kinerja n log n, yang sebenarnya tidak terlalu buruk. Dalam kasus umum, alternatifnya adalah membuat daftar semua string yang Anda rencanakan untuk digabungkan. Jika Anda menggunakan ArrayList, Anda harus menyalin lagi (kecuali Anda mengetahui panjang urutan Anda sebelumnya) dan jika Anda menggunakan LinkedList, maka itu menggunakan lebih banyak ram dan pengumpulan sampah dengan objek node. Terkadang Anda tidak bisa menang. Cobalah!
Ian
Contoh / pertanyaan di atas mengasumsikan beberapa kumpulan atau larik String yang dipesan untuk digabungkan. Selain itu, dengan menghitung ukuran sebelumnya, Anda menghindari karakter tambahan yang tidak digunakan yang biasanya dihasilkan oleh pertumbuhan array char [] internal.
Saya melihat banyak implementasi String.Join yang terlalu kompleks di sini. Jika Anda tidak memiliki Java 1.8, dan Anda tidak ingin mengimpor pustaka baru, implementasi di bawah ini sudah cukup.
publicStringjoin(Collection<String> col,String delim){StringBuilder sb =newStringBuilder();for(String s : col ){if( sb.length()!=0) sb.append(delim);
sb.append(s);}return sb.toString();}
Saya tidak yakin bagian mana dari pertanyaan yang dijawab ini? Ini bukan format String kecuali Anda berencana menambahkan bit dari string sedikit demi sedikit ke array, dan [1,0.92,3] tidak serba guna seperti string generik .join.
Omar Kooheji
-8
Saya hanya akan menggunakan operator penggabungan string "+" untuk menggabungkan dua string. s1 += s2;
Jawaban:
Objek Java String memiliki
format
metode (mulai 1.5), tetapi tidak adajoin
metode.Untuk mendapatkan sekumpulan metode utilitas String berguna yang belum disertakan, Anda dapat menggunakan org.apache.commons.lang.StringUtils .
sumber
String.join()
metode.String.format . Untuk bergabung, Anda perlu menulis sendiri:
Di atas berasal dari http://snippets.dzone.com/posts/show/91
sumber
Jambu datang dengan yang
Joiner
kelas .sumber
Pada Java 8,
join()
sekarang tersedia sebagai dua metode kelas pada kelas String. Dalam kedua kasus, argumen pertama adalah pembatas.Anda dapat memberikan individu
CharSequence
sebagai argumen tambahan :Atau Anda bisa lulus
Iterable<? extends CharSequence>
:Java 8 juga menambahkan kelas baru
StringJoiner
, yang dapat Anda gunakan seperti ini:sumber
TextUtils.join tersedia di Android
sumber
Anda juga dapat menggunakan argumen variabel untuk string sebagai berikut:
sumber
Untuk bergabung, saya yakin ini mungkin terlihat sedikit lebih mudah:
Saya tidak bisa menggunakan sintaks Java 5 sebanyak yang saya inginkan (Percaya atau tidak, saya telah menggunakan 1.0.x akhir-akhir ini) jadi saya mungkin agak berkarat, tapi saya yakin konsepnya benar .
edit tambahan: Penambahan string bisa lambat, tetapi jika Anda bekerja pada kode GUI atau beberapa rutinitas yang berjalan singkat, tidak masalah jika Anda mengambil .005 detik atau .006, jadi jika Anda memiliki koleksi yang disebut "joinMe" yang ingin Anda tambahkan ke string "target" yang ada, tidak akan mengerikan jika hanya sebaris ini:
Ini cukup tidak efisien (dan kebiasaan buruk), tetapi tidak apa pun yang dapat Anda lihat kecuali ada ribuan string atau ini ada di dalam lingkaran besar atau kode Anda benar-benar penting untuk performa.
Lebih penting lagi, mudah diingat, singkat, cepat dan sangat mudah dibaca. Performa tidak selalu menjadi pemenang otomatis dalam pilihan desain.
sumber
Inilah jawaban yang cukup sederhana. Gunakan
+=
karena ini lebih sedikit kode dan biarkan pengoptimal mengubahnya menjadiStringBuilder
untuk Anda. Dengan menggunakan metode ini, Anda tidak perlu melakukan pemeriksaan "terakhir" di loop Anda (peningkatan kinerja) dan Anda tidak perlu khawatir tentang menghapus pembatas apa pun di akhir.sumber
Saya tidak ingin mengimpor seluruh pustaka Apache untuk menambahkan fungsi gabungan sederhana, jadi inilah retasan saya.
sumber
removeCharAt
ada, dan seluruh fungsi tidak lagi mengembalikan String ... Akan memperbaiki ini.Jika Anda ingin menggabungkan (menggabungkan) beberapa string menjadi satu, Anda harus menggunakan StringBuilder. Ini jauh lebih baik daripada menggunakan
Ada juga sedikit kinerja menang atas StringBuffer, karena StringBuilder tidak menggunakan sinkronisasi.
Untuk metode utilitas tujuan umum seperti ini, metode ini (pada akhirnya) akan dipanggil berkali-kali dalam banyak situasi, jadi Anda harus membuatnya efisien dan tidak mengalokasikan banyak objek sementara. Kami telah membuat profil banyak, banyak aplikasi Java yang berbeda dan hampir selalu menemukan bahwa penggabungan string dan alokasi string / char [] membutuhkan banyak waktu / memori.
Metode collection -> string kami yang dapat digunakan kembali pertama-tama menghitung ukuran hasil yang diperlukan dan kemudian membuat StringBuilder dengan ukuran awal tersebut; ini menghindari penggandaan / penyalinan karakter internal [] yang tidak perlu yang digunakan saat menambahkan string.
sumber
Saya menulis sendiri:
tetapi
Collection
tidak didukung oleh JSP, jadi untuk fungsi tag saya menulis:dan masukkan ke
.tld
file:dan gunakan dalam file JSP sebagai:
sumber
StringUtils adalah kelas yang sangat berguna di perpustakaan Apache Commons Lang.
sumber
Ada
MessageFormat.format()
yang bekerja seperti C #String.Format()
.sumber
Saya melihat banyak implementasi String.Join yang terlalu kompleks di sini. Jika Anda tidak memiliki Java 1.8, dan Anda tidak ingin mengimpor pustaka baru, implementasi di bawah ini sudah cukup.
sumber
Jadi pada dasarnya, String ntop menyimpan nilai seluruh koleksi dengan pemisah koma dan tanda kurung.
sumber
Saya hanya akan menggunakan operator penggabungan string "+" untuk menggabungkan dua string.
s1 += s2;
sumber