Saya perlu menggabungkan dua String
array di Jawa.
void f(String[] first, String[] second) {
String[] both = ???
}
Apa cara termudah untuk melakukan ini?
java
arrays
concatenation
add
Antti Kissaniemi
sumber
sumber
array1 + array2
rangkaian sederhana .Jawaban:
Saya menemukan solusi satu baris dari perpustakaan lama Apache Commons Lang yang bagus.
ArrayUtils.addAll(T[], T...)
Kode:
sumber
Berikut adalah metode sederhana yang akan menggabungkan dua array dan mengembalikan hasilnya:
Perhatikan bahwa itu tidak akan berfungsi dengan tipe data primitif, hanya dengan tipe objek.
Versi yang sedikit lebih rumit berikut ini berfungsi dengan array objek dan primitif. Itu melakukan ini dengan menggunakan
T
bukanT[]
sebagai tipe argumen.Hal ini juga memungkinkan untuk menggabungkan array dari dua tipe yang berbeda dengan memilih tipe yang paling umum sebagai tipe komponen dari hasilnya.
Berikut ini sebuah contoh:
sumber
Array.newInstance(a.getClass().getComponentType(), aLen + bLen);
. Secara mengejutkan saya belum pernah melihat itu sebelumnya. @beaudet Saya pikir penjelasannya baik-baik saja di sini, mengingat mengapa ini sedang ditekan.Dimungkinkan untuk menulis versi sepenuhnya generik yang bahkan dapat diperluas untuk menggabungkan sejumlah array. Versi ini membutuhkan Java 6, seperti yang mereka gunakan
Arrays.copyOf()
Kedua versi menghindari membuat
List
objek perantara dan menggunakanSystem.arraycopy()
untuk memastikan bahwa menyalin array besar secepat mungkin.Untuk dua array terlihat seperti ini:
Dan untuk jumlah array yang arbitrer (> = 1) terlihat seperti ini:
sumber
T
- masing denganbyte
(dan kehilangan<T>
).ByteBuffer buffer = ByteBuffer.allocate(array1.length + array2.length); buffer.put(array1); buffer.put(array2); return buffer.array();
concat(ai, ad)
, di manaai
adaInteger[]
danad
sekarangDouble[]
. (Dalam hal ini, parameter tipe<T>
dipecahkan<? extends Number>
oleh kompiler.) Array yang dibuat olehArrays.copyOf
akan memiliki tipe komponen array pertama, yaituInteger
dalam contoh ini. Ketika fungsi akan menyalin array kedua, sebuahArrayStoreException
akan dilempar. Solusinya adalah memilikiClass<T> type
parameter tambahan .Menggunakan
Stream
di Java 8:Atau seperti ini, menggunakan
flatMap
:Untuk melakukan ini untuk tipe generik Anda harus menggunakan refleksi:
sumber
.boxed()
mereka yangStream
bukan tipe misalnyaIntStream
yang tidak dapat diteruskan sebagai parameterStream.concat
.a
danb
adalahint[]
, penggunaanint[] both = IntStream.concat(Arrays.stream(a), Arrays.stream(b)).toArray();
System.arrayCopy
. Tapi tidak terlalu lambat juga. Anda mungkin harus melakukan ini sangat berkali-kali dengan besar array di benar-benar kinerja konteks sensitif untuk waktu eksekusi perbedaan untuk peduli.Atau dengan Jambu kesayangan :
Juga, ada versi untuk array primitif:
Booleans.concat(first, second)
Bytes.concat(first, second)
Chars.concat(first, second)
Doubles.concat(first, second)
Shorts.concat(first, second)
Ints.concat(first, second)
Longs.concat(first, second)
Floats.concat(first, second)
sumber
Anda dapat menambahkan dua array dalam dua baris kode.
Ini adalah solusi cepat dan efisien dan akan bekerja untuk tipe primitif serta dua metode yang terlibat kelebihan beban.
Anda harus menghindari solusi yang melibatkan ArrayLists, stream, dll karena ini akan perlu mengalokasikan memori sementara tanpa tujuan yang bermanfaat.
Anda harus menghindari
for
loop untuk array besar karena ini tidak efisien. Metode bawaan menggunakan fungsi blok-salin yang sangat cepat.sumber
Menggunakan Java API:
sumber
both.toArray(new String[0])
akan lebih cepat daripadaboth.toArray(new String[both.size()])
, bahkan jika itu bertentangan dengan intuisi naif kita. Itulah mengapa sangat penting untuk mengukur kinerja aktual saat mengoptimalkan. Atau cukup gunakan konstruk yang lebih sederhana, ketika keunggulan varian yang lebih rumit tidak dapat dibuktikan.Solusi 100% java lama dan tanpa
System.arraycopy
(tidak tersedia di klien GWT misalnya):sumber
null
cek. Dan mungkin mengatur beberapa variabel Andafinal
.null
Pemeriksaan @TrippKinetics akan menyembunyikan NPE daripada menunjukkannya dan menggunakan final untuk vars lokal tidak memiliki manfaat (belum).Saya baru-baru ini menghadapi masalah dengan rotasi memori yang berlebihan. Jika a dan / atau b diketahui umumnya kosong, berikut ini adalah adaptasi lain dari kode silvertab (dibuat juga):
Sunting: Versi sebelumnya dari posting ini menyatakan bahwa penggunaan ulang array seperti ini harus didokumentasikan dengan jelas. Seperti yang ditunjukkan oleh Maarten dalam komentar, secara umum akan lebih baik untuk menghapus pernyataan if, sehingga membatalkan kebutuhan untuk memiliki dokumentasi. Tetapi sekali lagi, pernyataan if adalah inti dari optimasi khusus ini. Saya akan meninggalkan jawaban ini di sini, tetapi berhati-hatilah!
sumber
System.arraycopy
menyalin isi array?if
pernyataan saja merupakan cara yang paling mudah.The Java Fungsional perpustakaan memiliki kelas wrapper array melengkapi array dengan metode berguna seperti Rangkaian.
...lalu
Untuk mendapatkan kembali array yang terbuka, panggil
sumber
sumber
both.toArray(new String[both.size()])
Cara lain dengan Java8 menggunakan Stream
sumber
Berikut ini adalah adaptasi dari solusi silvertab, dengan obat generik yang dilengkapi:
CATATAN: Lihat jawaban Joachim untuk solusi Java 6. Tidak hanya menghilangkan peringatan; juga lebih pendek, lebih efisien, dan lebih mudah dibaca!
sumber
Jika Anda menggunakan cara ini maka Anda tidak perlu mengimpor kelas pihak ketiga mana pun.
Jika Anda ingin menyatukan
String
Kode sampel untuk dua String Array
Jika Anda ingin menyatukan
Int
Kode sampel untuk dua bilangan bulat Integer
Berikut adalah metode Utama
Kita bisa menggunakan cara ini juga.
sumber
Maafkan saya karena telah menambahkan versi lain ke daftar yang sudah lama ini. Saya melihat setiap jawaban dan memutuskan bahwa saya benar-benar menginginkan versi dengan hanya satu parameter di tanda tangan. Saya juga menambahkan beberapa pemeriksaan argumen untuk mendapatkan manfaat dari kegagalan awal dengan info yang masuk akal jika input tidak terduga.
sumber
Anda dapat mencoba mengubahnya menjadi Arraylist dan menggunakan metode addAll kemudian mengonversi kembali ke array.
sumber
Menggunakan aliran Java 8+ Anda dapat menulis fungsi berikut:
sumber
Di sini kemungkinan implementasi dalam kode kerja dari solusi kode semu yang ditulis oleh silvertab.
Terima kasih silvertab!
Mengikuti selanjutnya adalah antarmuka pembangun.
Catatan: Builder diperlukan karena di java tidak mungkin dilakukan
new T[size]
karena penghapusan tipe generik:
Di sini pembangun beton mengimplementasikan antarmuka, membangun sebuah
Integer
array:Dan akhirnya aplikasi / tes:
sumber
Ini harus satu baris.
sumber
Wow! banyak jawaban kompleks di sini termasuk beberapa jawaban sederhana yang bergantung pada dependensi eksternal. bagaimana kalau melakukannya seperti ini:
sumber
Ini berfungsi, tetapi Anda harus memasukkan pemeriksaan kesalahan Anda sendiri.
Ini mungkin bukan yang paling efisien, tetapi tidak bergantung pada apa pun selain API Java sendiri.
sumber
for
loop kedua dengan itu:for(int j = 0; j < arr2.length; j++){arrBoth[arr1.length+j] = arr2[j];}
String[] arrBoth = java.util.Arrays.copyOf(arr1, arr1.length + arr2.length)
untuk melewatifor
loop pertama . Menghemat waktu sebanding dengan ukuranarr1
.Ini adalah fungsi yang dikonversi untuk array String:
sumber
Bagaimana dengan sederhana
Dan lakukan saja
Array.concat(arr1, arr2)
. Selamaarr1
danarr2
dari jenis yang sama, ini akan memberi Anda array lain dari jenis yang sama yang mengandung kedua array.sumber
Versi statis umum yang menggunakan System.arraycopy berkinerja tinggi tanpa memerlukan anotasi @SuppressWarnings:
sumber
sumber
Ini adalah versi saya yang sedikit lebih baik dari concatAll Joachim Sauer. Ini dapat bekerja pada Java 5 atau 6, menggunakan System.arraycopy Java 6 jika tersedia saat runtime. Metode ini (IMHO) sangat cocok untuk Android, karena bekerja pada Android <9 (yang tidak memiliki System.arraycopy) tetapi akan menggunakan metode yang lebih cepat jika memungkinkan.
sumber
Cara lain untuk memikirkan pertanyaan itu. Untuk menggabungkan dua array atau lebih, yang harus dilakukan adalah membuat daftar semua elemen dari setiap array, dan kemudian membangun array baru. Ini terdengar seperti membuat
List<T>
dan kemudian memanggilnyatoArray
. Beberapa jawaban lain digunakanArrayList
, dan itu tidak masalah. Tetapi bagaimana dengan mengimplementasikan kita sendiri? Itu tidak sulit:Saya percaya hal di atas setara dengan solusi yang digunakan
System.arraycopy
. Namun saya pikir yang ini memiliki keindahannya sendiri.sumber
Bagaimana tentang :
sumber
Variasi sederhana yang memungkinkan penggabungan lebih dari satu array:
sumber
Hanya menggunakan API milik Javas:
Sekarang, kode ini bukan yang paling efisien, tetapi hanya bergantung pada kelas-kelas java standar dan mudah dimengerti. Ini berfungsi untuk sejumlah String [] (bahkan nol array).
sumber