Apakah ada cara di java untuk membuat string dengan jumlah karakter yang ditentukan? Dalam kasus saya, saya perlu membuat string dengan 10 spasi. Kode saya saat ini adalah:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
Apakah ada cara yang lebih baik untuk mencapai hal yang sama. Khususnya saya suka sesuatu yang cepat (dalam hal eksekusi).
java
string
stringbuffer
C. Ross
sumber
sumber
append(' ')
saja ... ini melibatkan komputasi yang sedikit lebih sedikit ...Jawaban:
For loop akan dioptimalkan oleh kompiler. Dalam kasus seperti ini, Anda tidak perlu peduli tentang pengoptimalan sendiri. Percayai kompiler.
BTW, jika ada cara untuk membuat string dengan karakter n spasi, daripada dikodekan dengan cara yang sama seperti yang baru saja Anda lakukan.
sumber
static Dictionary<int, String>
?" ".substring(0, 10);
Kemungkinan kode terpendek menggunakan
String
API, secara eksklusif:Sebagai metode, tanpa langsung membuat contoh
char
:Meminta menggunakan:
sumber
Hmm sekarang saya memikirkannya, mungkin
Arrays.fill
:Tentu saja, saya berasumsi bahwa
fill
metode ini melakukan hal yang sama dengan kode Anda, jadi mungkin akan melakukan hal yang sama, tetapi setidaknya ini lebih sedikit baris.sumber
Arrays.fill()
fungsi ini digunakan secara konsisten untuk melakukan pekerjaan ini di kode Anda dan kode perpustakaan (standar dan eksternal), maka itu membuat kandidat yang baik untuk kompilasi Hotspot, dan memiliki peluang lebih besar untuk ditemukan cache CPU Anda. JVM masa depan dapat menetapkannya sebagai fungsi intrinsik . Menggulung Anda sendiri memotong Anda dari semua kebaikan kinerja ini ...Saya sangat menyarankan untuk tidak menulis loop dengan tangan. Anda akan melakukannya berulang kali selama karir pemrograman Anda. Orang-orang yang membaca kode Anda - termasuk Anda - selalu harus menginvestasikan waktu, meskipun hanya beberapa detik, untuk mencerna makna dari loop tersebut.
Alih-alih menggunakan kembali salah satu pustaka yang tersedia yang menyediakan kode seperti itu
StringUtils.repeat
dari Apache Commons Lang :Dengan begitu Anda juga tidak perlu repot tentang kinerja, sehingga semua detail mengerikan
StringBuilder
, optimisasi Kompiler dll. Disembunyikan. Jika fungsinya akan menjadi lambat itu akan menjadi bug dari perpustakaan.Dengan Java 11 menjadi lebih mudah:
sumber
Di Java 8 Anda dapat menggunakan
String.join
:sumber
Jika Anda hanya ingin spasi, lalu bagaimana:
yang akan menghasilkan abs (n) spasi;
sumber
sejak Jawa 11 :
sejak Java 8 :
dimana:
sumber
Karena Java 11, Anda cukup menggunakan
String.repeat(count)
untuk menyelesaikan masalah Anda.Jadi alih-alih loop, kode Anda hanya akan terlihat seperti ini:
sumber
Saya pikir ini adalah kode yang kurang mungkin, menggunakan kelas Guava Joiner:
sumber
pubic String n(int n) { ... }
yang akan memungkinkan kode "kurang":,n(10)
tapi sekali lagi, tidak masuk akal.Anda dapat menggunakan
String.format
fungsi standar untuk menghasilkan spasi N. Sebagai contoh:Membuat string dengan 5 spasi.
atau
Membuat string 15 spacebars.
Jika Anda ingin simbol lain diulang, Anda harus mengganti spasi dengan simbol yang Anda inginkan:
Keluaran:
sumber
Kontribusi saya berdasarkan algoritma eksponensial cepat.
Saya menguji algoritma terhadap dua pendekatan lain:
String.concat()
untuk menyatukan stringStringBuilder
Kode uji (gabungan menggunakan for loop dan
String.concat()
menjadi lambat untuk besarn
, jadi saya meninggalkannya setelah iterasi ke-5).Hasil:
Kesimpulan:
n
- gunakan pendekatan rekursifn
- untuk loop memiliki kecepatan yang cukupsumber
if
pernyataan itu akan mengacaukan prediksi cabang CPU. Ini harus benar-benar diulangi menggunakan JMH ( openjdk.java.net/projects/code-tools/jmh ), jika tidak, ini agak tidak berguna.Bagaimana dengan ini?
sumber
Mengingat kami memiliki:
Java 8 (Menggunakan Stream)
Java 8 (Menggunakan nCopies)
sumber
Collectors.joining(EMPTY_STRING)
setara denganCollectors.joining()
RandomStringUtils memiliki ketentuan untuk membuat string dari ukuran input yang diberikan. Tidak dapat mengomentari kecepatan, tetapi satu liner.
menciptakan output
lebih disukai jika Anda tidak ingin melihat \ 0 dalam kode Anda.
sumber
Gunakan StringUtils: StringUtils.repeat ('', 10)
sumber
Dalam kebanyakan kasus, Anda hanya membutuhkan string hingga panjang tertentu, katakanlah 100 spasi. Anda bisa menyiapkan larik String di mana nomor indeks sama dengan ukuran string yang diisi spasi dan mencari string, jika panjang yang dibutuhkan berada dalam batas atau membuatnya sesuai permintaan jika di luar batas.
sumber
Solusi terpendek dengan Jambu Biji:
Melalui cara sederhana untuk mengulang String di java .
sumber
Cukup ganti StringBuffer Anda dengan StringBuilder . Sulit untuk mengalahkannya.
Jika panjang Anda adalah jumlah yang besar, Anda dapat menerapkan beberapa penambahan sendiri yang lebih efisien (tapi lebih canggung), menduplikasi panjangnya di setiap iterasi:
Anda juga dapat mencoba
Arrays.fill()
pendekatan tersebut ( FrustratedWithFormsDesigner jawaban).sumber
Anda bisa menggantinya
StringBuffer
denganStringBuilder
(yang terakhir tidak disinkronkan, mungkin lebih cepat dalam satu aplikasi utas)Dan Anda dapat membuat
StringBuilder
instance satu kali, alih-alih membuatnya setiap kali Anda membutuhkannya.Sesuatu seperti ini:
Dan gunakan seperti ini:
Jika Anda menganggap
createA
variabel Anda sebagai instance, Anda dapat menghemat waktu membuat instance.Ini bukan utas aman, jika Anda memiliki banyak utas, setiap utas harus memiliki salinannya sendiri.
sumber
Untuk kinerja yang baik, gabungkan jawaban dari aznilamir dan dari FrustratedWithFormsDesigner
Sesuaikan ukuran
BLANKS
tergantung pada kebutuhan Anda.BLANKS
String spesifik saya sekitar 200 karakter.sumber
Punya metode seperti ini. Ini menambahkan ruang yang dibutuhkan pada akhir yang diberikan
String
untuk memberikanString
panjang tertentu.sumber
Ingin String memiliki ukuran tetap, sehingga Anda dapat membalut atau memotong, untuk mentabulasi data ...
Referensi yang sangat baik di sini .
sumber
Ini berhasil bagi saya tanpa menggunakan perpustakaan eksternal di Java 8
Dan hasilnya
sumber
int c = 10; String spasi = String.format ("%" + c + "c", ''); ini akan menyelesaikan masalah Anda.
sumber
Metode sederhana seperti di bawah ini juga dapat digunakan
sumber
bagaimana dengan ini?
EDIT: Saya sudah menulis kode sederhana untuk menguji konsep dan di sini apa yang saya temukan.
Metode 1: menambahkan ruang tunggal dalam satu lingkaran:
Metode 2: tambahkan 100 spasi dan loop, lalu substring:
Hasilnya saya dapat membuat 12.345.678 spasi:
dan untuk 10.000.000 ruang:
menggabungkan alokasi langsung dan iterasi selalu membutuhkan waktu lebih sedikit, rata-rata 60 ms lebih sedikit ketika membuat ruang besar. Untuk ukuran yang lebih kecil, kedua hasilnya dapat diabaikan.
Tapi tolong terus berkomentar :-)
sumber
Saya tahu tidak ada metode bawaan untuk apa yang Anda tanyakan. Namun, untuk panjang tetap kecil seperti 10, metode Anda harus cepat.
sumber