Saya tahu kita bisa menambahkan string menggunakan StringBuilder
. Adakah cara agar kita dapat menambahkan string (yaitu menambahkan string di depan string) menggunakan StringBuilder
sehingga kita dapat mempertahankan keunggulan kinerja yang StringBuilder
ditawarkan?
c#
java
stringbuilder
burnt1ce
sumber
sumber
Jawaban:
Menggunakan metode sisipkan dengan parameter posisi disetel ke 0 akan sama dengan persiapan (yaitu memasukkan di awal).
Contohnya adalah:
varStringBuilder.insert(0, "someThing");
Ia bekerja baik untuk C # dan Java
sumber
Mempersiapkan String biasanya memerlukan penyalinan semuanya setelah titik penyisipan kembali beberapa di larik pendukung, sehingga tidak akan secepat menambahkan ke bagian akhir.
Tetapi Anda dapat melakukannya seperti ini di Java (di C # itu sama, tetapi metodenya disebut
Insert
):sumber
Jika Anda membutuhkan kinerja tinggi dengan banyak tambahan, Anda harus menulis versi Anda sendiri
StringBuilder
(atau menggunakan versi orang lain). Dengan standarStringBuilder
(meskipun secara teknis dapat diimplementasikan secara berbeda), penyisipan memerlukan penyalinan data setelah titik penyisipan. Memasukkan n bagian teks dapat memakan waktu O (n ^ 2).Pendekatan yang naif adalah dengan menambahkan offset ke dalam backing
char[]
buffer serta panjangnya. Jika tidak ada cukup ruang untuk tambahan, pindahkan data lebih dari yang benar-benar diperlukan. Ini dapat membawa kinerja kembali ke O (n log n) (saya pikir). Pendekatan yang lebih halus adalah membuat buffer siklik. Dengan cara itu, ruang kosong di kedua ujung larik menjadi bersebelahan.sumber
Anda dapat mencoba metode ekstensi:
sumber
Anda bisa membuat senar secara terbalik dan kemudian membalikkan hasilnya. Anda dikenakan biaya O (n) dan bukan biaya kasus terburuk O (n ^ 2).
sumber
Saya belum pernah menggunakannya tetapi Ropes For Java Kedengarannya menarik. Nama proyek adalah permainan kata-kata, gunakan Rope sebagai ganti String untuk pekerjaan serius. Mendapat penalti kinerja untuk persiapan dan operasi lainnya. Layak untuk dilihat, jika Anda akan melakukan banyak hal seperti ini.
sumber
Inilah yang dapat Anda lakukan jika Anda ingin menambahkan kelas StringBuilder Java:
sumber
Jika saya memahami Anda dengan benar, metode sisipkan sepertinya akan melakukan apa yang Anda inginkan. Masukkan saja string pada offset 0.
sumber
Coba gunakan Sisipkan ()
sumber
Dilihat dari komentar lain, tidak ada cara cepat standar untuk melakukan ini. Menggunakan StringBuilder's
.Insert(0, "text")
kira-kira hanya 1-3x lebih cepat daripada menggunakan penggabungan String yang sangat lambat (berdasarkan> 10000 concat), jadi di bawah ini adalah kelas untuk menambahkan potensi ribuan kali lebih cepat!Saya telah menyertakan beberapa fungsi dasar lainnya seperti
append()
,subString()
danlength()
lain lain. Kedua appends dan prepends bervariasi dari sekitar dua kali lebih cepat hingga 3x lebih lambat daripada yang ditambahkan StringBuilder. Seperti StringBuilder, buffer di kelas ini akan meningkat secara otomatis saat teks melebihi ukuran buffer yang lama.Kode telah diuji cukup banyak, tetapi saya tidak dapat menjamin bebas dari bug.
sumber
Anda dapat membuat ekstensi untuk StringBuilder sendiri dengan kelas sederhana:
Lalu, tambahkan saja:
Di bagian atas setiap kelas tempat Anda ingin menggunakan StringBuilder dan setiap kali Anda menggunakan intelli-sense dengan variabel StringBuilder, metode Prepend dan PrependLine akan muncul. Ingatlah bahwa saat Anda menggunakan Tambahkan ke Awal, Anda perlu Menambahkan Awal dalam urutan terbalik daripada jika Anda Menambahkan.
sumber
Ini harus bekerja:
sumber
string
, tetapi tidak berfungsi dengan nilai tipeStringBuilder
. Jawaban dari @ScubaSteve berfungsi dengan baik.