Ketika Anda harus mengulang koleksi dan membuat string dari setiap data yang dipisahkan oleh pembatas, Anda selalu berakhir dengan pembatas tambahan di akhir, misalnya
for (String serverId : serverIds) {
sb.append(serverId);
sb.append(",");
}
Memberikan sesuatu seperti: serverId_1, serverId_2, serverId_3,
Saya ingin menghapus karakter terakhir di StringBuilder (tanpa mengubahnya karena saya masih membutuhkannya setelah loop ini).
java
stringbuilder
Matius
sumber
sumber
StringJoiner
: stackoverflow.com/a/29169233/901641Jawaban:
Orang lain telah menunjukkan
deleteCharAt
metode ini, tetapi inilah pendekatan alternatif lain:Atau, gunakan
Joiner
kelas dari Jambu :)Pada Java 8,
StringJoiner
adalah bagian dari JRE standar.sumber
Joiner
juga di merekaStringUtils
. commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/… , java.lang.String)Solusi sederhana lainnya adalah:
Solusi yang lebih rumit:
Solusi di atas mengasumsikan bahwa
sb.length() > 0
... yaitu ada "karakter terakhir" untuk dihapus. Jika Anda tidak bisa membuat asumsi itu, dan / atau Anda tidak bisa berurusan dengan pengecualian yang akan terjadi jika asumsi itu tidak benar, maka periksa panjang StringBuilder terlebih dahulu; misalnyaatau
sumber
sumber
sb.length() == 0
jugaseparator.length()
bukan 1.Pada Java 8, kelas String memiliki metode statis
join
. Argumen pertama adalah string yang Anda inginkan di antara setiap pasangan string, dan argumen kedua adalahIterable<CharSequence>
(yang keduanya merupakan antarmuka, jadi sesuatu sepertiList<String>
berfungsi. Jadi, Anda bisa melakukan ini:Juga di Java 8, Anda bisa menggunakan
StringJoiner
kelas baru , untuk skenario di mana Anda ingin mulai membangun string sebelum Anda memiliki daftar lengkap elemen untuk dimasukkan ke dalamnya.sumber
String.join
bukanStringJoiner
.Dapatkan saja posisi kemunculan karakter terakhir.
Karena
lastIndexOf
akan melakukan pencarian terbalik, dan Anda tahu itu akan ditemukan pada percobaan pertama, kinerja tidak akan menjadi masalah di sini.EDIT
Karena saya terus mendapatkan jawaban saya (terima kasih kawan 😊), perlu diperhatikan bahwa:
Di Java 8 dan seterusnya hanya akan lebih mudah dibaca dan eksplisit untuk menggunakan StringJoiner . Ini memiliki satu metode untuk pemisah sederhana, dan kelebihan untuk awalan dan akhiran.
Contoh diambil dari sini: contoh
Contoh menggunakan pemisah sederhana:
Keluaran:
Contoh dengan akhiran dan awalan:
Keluaran
sumber
,
karena itu adalah pernyataan terakhir darifor loop
. InilastInfexOf
lebih untuk keterbacaan dan menjadikannya no-brainer jika Anda tidak ingin mengingat apakah itu 0-diindeks atau tidak. Selanjutnya, Anda tidak perlu ikut campur dengan panjang stringbuilder. Hanya untuk kenyamanan.Pada kasus ini,
lebih disukai karena hanya menetapkan nilai terakhir ke
'\0'
sedangkan menghapus karakter terakhir tidakSystem.arraycopy
sumber
setLength
panggilan tidak menetapkan apa-apa untuk nilai terakhir. Buffer string Java tidak dibatalkan nol / nol. Bahkan,setLength
hanya memperbaruilength
bidang.arraycopy
elemen copy 0, jadi saya kira itu bisa dioptimalkan jauh.Dengan
Java-8
Anda dapat menggunakan metode statisString
kelas,String#join(CharSequence delimiter,Iterable<? extends CharSequence> elements)
.KELUARAN
sumber
Alternatif lain
sumber
Kalau tidak,
sumber
sumber
Alternatif lain:
sumber
Untuk menghindari pengulangan (memengaruhi kinerja)
prefix
penggunaan TextUtils.isEmpty:sumber
Anda dapat mencoba menggunakan kelas 'Joiner' alih-alih menghapus karakter terakhir dari teks yang Anda buat;
sumber
Saya melakukan sesuatu seperti di bawah ini:
sumber
Ini solusi lain:
sumber
Saya pribadi ingin menambahkan karakter backspace (atau lebih "pembatas" lebih lama) pada akhirnya:
Perhatikan bahwa ada masalah:
\b
ditampilkan tergantung pada lingkungan,length()
dariString
konten mungkin berbeda dari panjang "visibile" karakterKetika
\b
terlihat OK dan panjangnya tidak masalah seperti masuk ke konsol, ini sepertinya cukup baik untuk saya.sumber
stringBuilder.Hapus (stringBuilder.Panjang - 1, 1);
sumber