Saya mencari metode atau operator commons sederhana yang memungkinkan saya untuk mengulang beberapa String n kali. Saya tahu saya bisa menulis ini menggunakan for loop, tapi saya ingin menghindari loop kapan pun diperlukan dan metode langsung sederhana harus ada di suatu tempat.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Berhubungan dengan:
repeat string javascript Buat NSString dengan mengulangi string lain beberapa kali
Diedit
Saya mencoba untuk menghindari loop ketika mereka tidak sepenuhnya diperlukan karena:
Mereka menambah jumlah baris kode bahkan jika mereka tersimpan di fungsi lain.
Seseorang yang membaca kode saya harus mencari tahu apa yang saya lakukan untuk loop itu. Bahkan jika itu dikomentari dan memiliki nama variabel yang berarti, mereka masih harus memastikan itu tidak melakukan sesuatu yang "pintar".
Programmer suka menempatkan hal-hal yang cerdas dalam loop, bahkan jika saya menulisnya untuk "hanya melakukan apa yang dimaksudkan untuk dilakukan", itu tidak menghalangi seseorang datang dan menambahkan beberapa "perbaikan" pintar pintar.
Mereka seringkali mudah salah. Untuk loop yang melibatkan indeks cenderung menghasilkan off oleh satu bug.
Untuk loop sering menggunakan kembali variabel yang sama, meningkatkan kemungkinan sangat sulit untuk menemukan bug pelingkupan.
Untuk loop meningkatkan jumlah tempat yang harus dicari oleh pemburu bug.
Jawaban:
String::repeat
Baru di Java 11 adalah metode
String::repeat
yang melakukan persis apa yang Anda minta:Javadoc- nya mengatakan:
sumber
"abc".repeat(3)
Ini adalah versi terpendek (diperlukan Java 1.5+):
Di mana
n
berapa kali Anda ingin mengulangi string dans
string untuk mengulang.Tidak perlu impor atau perpustakaan.
sumber
char[]
, dalam hal ini) adalah instantiated dengan nulls, kemudian aString
dibuat darichar[]
, dan nulls adalahreplaced()
dengan karakter yang Anda inginkans
...replace('\0', str)
harus digunakan daripada versi String.replace(char oldChar, char newChar)
danreplace(CharSequence target, CharSequence replacement)
jadi saya tidak melihat bagaimana itu bisa bekerjaJika Anda menggunakan Java <= 7 , ini sama ringkasnya dengan:
Di Java 8 dan di atasnya ada cara yang lebih mudah dibaca:
Akhirnya, untuk Java 11 dan di atasnya, ada
repeat(int count)
metode baru khusus untuk ini ( tautan )Atau, jika proyek Anda menggunakan perpustakaan java ada lebih banyak pilihan.
Untuk Apache Commons :
Untuk Google Guava :
sumber
n
nol.s
haruslah String, bukan aChar
Commons Lang StringUtils.repeat ()
Pemakaian:
sumber
Java 8's
String.join
menyediakan cara yang rapi untuk melakukan ini bersama denganCollections.nCopies
:sumber
Berikut cara untuk melakukannya hanya menggunakan fungsi String standar dan tidak ada loop eksplisit:
sumber
replace()
. Di Java 1.5+, ada versi overloadreplace()
yang memerlukan duaCharSequence
s (termasukString
s): download.oracle.com/javase/1.5.0/docs/api/java/lang/…n=3
: pertama-tama memformat string agar terlihat seperti%03d
(%%
adalah untuk menghindari tanda persentase), yang merupakan kode pemformatan untuk menambahkan 3 angka nol, kemudian memformat0
dengan itu, mengarah ke000
, dan akhirnya mengganti masing0
- masing dengan stringJika Anda seperti saya dan ingin menggunakan Google Guava dan bukan Apache Commons. Anda bisa menggunakan metode pengulangan di kelas Guava Strings.
sumber
Dengan java-8, kamu juga bisa menggunakan
Stream.generate
.dan Anda dapat membungkusnya dengan metode utilitas sederhana jika diperlukan:
sumber
return IntStream.range(0, times).mapToObj(i -> str).collect(joining());
yang memparalelkan lebih baikJadi, Anda ingin menghindari loop?
Di sini Anda memilikinya:
(tentu saja saya tahu ini jelek dan tidak efisien, tetapi tidak memiliki loop :-p)
Anda ingin itu lebih sederhana dan lebih cantik? gunakan jython:
Sunting : mari optimalkan sedikit :-D
Sunting2 : Saya telah melakukan patokan cepat dan kotor untuk 4 alternatif utama, tapi saya tidak punya waktu untuk menjalankannya beberapa kali untuk mendapatkan cara dan merencanakan waktu untuk beberapa input ... Jadi, inilah kode jika ada yang mau untuk mencobanya:
Dibutuhkan 2 argumen, yang pertama adalah jumlah iterasi (setiap fungsi dijalankan dengan waktu pengulangan arg dari 1..n) dan yang kedua adalah string untuk diulang.
Sejauh ini, inspeksi cepat terhadap waktu yang berjalan dengan input yang berbeda meninggalkan peringkat seperti ini (lebih baik menjadi lebih buruk):
Saya tidak akan pernah menduga bahwa fungsi rekursif lebih cepat daripada
for
loop: -oBersenang-senang (xD opsional).
sumber
Ini mengandung lebih sedikit karakter daripada pertanyaan Anda
sumber
commons-lang3.3.1-sources
dan Anda tidak sebagus itu lagi;) Tetapi jika seseorang sudah memilikinyacommons-lang
, saya mendukung jawaban Anda.berdasarkan jawaban fortran , ini adalah versi recusive yang menggunakan StringBuilder:
sumber
menggunakan Dollar itu sederhana seperti mengetik:
PS: ulangi juga berfungsi untuk array, Daftar, Set, dll
sumber
Saya ingin fungsi untuk membuat daftar tanda tanya yang dibatasi koma untuk keperluan JDBC, dan menemukan posting ini. Jadi, saya memutuskan untuk mengambil dua varian dan melihat mana yang berkinerja lebih baik. Setelah 1 juta iterasi, StringBuilder varietas-taman membutuhkan waktu 2 detik (fun1), dan versi samar yang seharusnya lebih optimal (fun2) memerlukan waktu 30 detik. Apa gunanya menjadi samar lagi?
sumber
Solusi OOP
Hampir setiap jawaban mengusulkan fungsi statis sebagai solusi, tetapi dengan memikirkan Object-Oriented (untuk keperluan-penggunaan-ulang dan kejelasan) saya datang dengan Solusi melalui Delegasi melalui CharSequence-Interface (yang juga membuka kegunaan pada CharSequence-Classes yang dapat diubah).
Kelas berikut dapat digunakan baik dengan atau tanpa Separator-String / CharSequence dan setiap panggilan ke "toString ()" membangun String akhir yang diulang. Input / Separator tidak hanya terbatas pada String-Class, tetapi dapat setiap Kelas yang mengimplementasikan CharSequence (mis. StringBuilder, StringBuffer, dll)!
Kode sumber:
Contoh-Penggunaan:
Contoh-Output:
sumber
hanya menggunakan kelas JRE ( System.arraycopy ) dan mencoba untuk meminimalkan jumlah objek temp Anda dapat menulis sesuatu seperti:
EDIT
dan tanpa loop Anda dapat mencoba:
EDIT 2
menggunakan Koleksi bahkan lebih pendek:
namun saya masih suka versi pertama.
sumber
Bukan yang terpendek, tetapi (saya pikir) cara tercepat adalah dengan menggunakan StringBuilder:
sumber
Jika kecepatan menjadi perhatian Anda, maka Anda harus menggunakan penyalinan sebanyak mungkin memori. Oleh karena itu diperlukan untuk bekerja dengan array karakter.
Untuk menguji kecepatan, metode optimal yang serupa menggunakan StirngBuilder adalah seperti ini:
dan kode untuk mengujinya:
Dan di sini jalankan hasil dari sistem saya:
Perhatikan bahwa tes untuk loop adalah untuk menendang JIT dan memiliki hasil yang optimal.
sumber
demi keterbacaan dan portabilitas:
sumber
Jika Anda khawatir tentang kinerja, cukup gunakan StringBuilder di dalam loop dan lakukan .toString () saat keluar dari Loop. Heck, tulis Kelas Util Anda sendiri dan gunakan kembali. 5 Baris kode maks.
sumber
Saya sangat menikmati pertanyaan ini. Ada banyak pengetahuan dan gaya. Jadi saya tidak bisa meninggalkannya tanpa menunjukkan rock and roll saya;)
Apakah kamu menyukainya?
sumber
sumber
Lingkaran sederhana
sumber
times
ke konstruktor StringBuilder.Coba ini:
sumber
Dengan menggunakan rekursi, Anda dapat melakukan hal berikut (menggunakan operator ternary, satu baris maksimal):
Saya tahu, itu jelek dan mungkin tidak efisien, tetapi satu baris!
sumber
solusi langsung satu jalur:
membutuhkan Java 8
sumber
Meskipun keinginan Anda untuk tidak menggunakan loop, saya pikir Anda harus menggunakan loop.
Alasan Anda untuk tidak menggunakan for for bukan alasan yang bagus. Menanggapi kritik Anda:
sumber
repetitions = -5
. b) mengunduh Commons Lang dan menjalankanrepeatString('a', 1000)
jutaan kali dalam satu lingkaran; lakukan hal yang sama dengan kode Anda; bandingkan waktu. Untuk kredit tambahan lakukan hal yang sama denganrepeatString('ab', 1000)
.StringUtils.repeat("ab",1000)
? Karena itu adalah jawaban saya yang telah Anda turunkan. Ini juga berkinerja lebih baik dan tidak memiliki bug.Jika Anda hanya tahu panjang string output (dan mungkin tidak dapat habis dibagi dengan panjang string input), maka gunakan metode ini:
Demo penggunaan:
Jangan gunakan dengan kosong
s
danlength
> 0, karena tidak mungkin untuk mendapatkan hasil yang diinginkan dalam kasus ini.sumber
di sini adalah Stringutils.java terbaru StringUtils.java
bahkan tidak perlu sebesar ini, dapat dibuat menjadi ini, dan dapat disalin dan ditempelkan ke kelas utilitas dalam proyek Anda.
Jadi e5, saya pikir cara terbaik untuk melakukan ini adalah dengan menggunakan kode yang disebutkan di atas, atau salah satu jawaban di sini. tetapi commons lang terlalu besar jika itu adalah proyek kecil
sumber
Saya menciptakan metode rekursif yang melakukan hal yang sama seperti yang Anda inginkan .. jangan ragu untuk menggunakan ini ...
saya punya jawaban yang sama di Bisakah saya mengalikan string di java untuk mengulangi urutan?
sumber
StringBuilder
sebagai gantinya.Anda dapat menggunakan metode rekursif ini untuk tujuan yang Anda inginkan.
sumber