Sertailah Array of Primitives dengan Separator di Java

1. Pengenalan

Dalam tutorial ringkas ini, kita akan belajar bagaimana menggabungkan array primitif dengan pemisah satu karakter di Java . Sebagai contoh, kami akan mempertimbangkan dua tatasusunan: susunan int dan susunan arang .

2. Mendefinisikan Masalah

Mari kita mulakan dengan menentukan array int dan array char untuk contohnya, serta watak pemisah yang akan kita gunakan untuk menggabungkan kandungannya:

int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9}; char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'}; char separatorChar = '-'; String separator = String.valueOf(separatorChar); 

Perhatikan bahawa kami telah memasukkan pemisah char dan String kerana beberapa kaedah yang akan kami tunjukkan memerlukan argumen char , sementara yang lain memerlukan argumen String .

Hasil operasi bergabung akan berisi "1-2-3-4-5-6-7-8-9" untuk array int , dan "abcdef" untuk array char .

3. Pengumpul . Bergabung ()

Mari kita mulakan dengan salah satu kaedah yang tersedia dari Java 8 Stream API - Collectors.joining () .

Pertama, kami membuat Stream dari pelbagai primitif menggunakan kaedah Arrays.stream () yang terdapat dalam pakej java.util . Seterusnya, kami memetakan setiap elemen ke String . Dan akhirnya, kami menggabungkan elemen dengan pemisah yang kami berikan.

Mari mulakan dengan susunan int kami :

String joined = Arrays.stream(intArray) .mapToObj(String::valueOf) .collect(Collectors.joining(separator));

Semasa menggabungkan array char kami dengan kaedah ini, kami mesti membungkus array char ke CharBuffer dan kemudian memproyeksikannya ke char semula. Ini kerana aksara () kaedah pulangan yang Stream daripada int nilai.

Sayangnya, Java Stream API tidak menyediakan kaedah asli untuk membungkus Stream of char .

Mari sertai array char kami :

String joined = CharBuffer.wrap(charArray).chars() .mapToObj(intValue -> String.valueOf((char) intValue)) .collect(Collectors.joining(separator));

4. StringJoiner

Begitu juga dengan Collectors.joining () , pendekatan ini menggunakan Stream API, tetapi bukannya mengumpulkan elemen, iterasi melalui elemen dan menambahkannya ke contoh StringJoiner :

StringJoiner intStringJoiner = new StringJoiner(separator); Arrays.stream(intArray) .mapToObj(String::valueOf) .forEach(intStringJoiner::add); String joined = intStringJoiner.toString();

Sekali lagi, kita harus membungkus array char kita ke CharBuffer ketika menggunakan Stream API:

StringJoiner charStringJoiner = new StringJoiner(separator); CharBuffer.wrap(charArray).chars() .mapToObj(intChar -> String.valueOf((char) intChar)) .forEach(charStringJoiner::add); String joined = charStringJoiner.toString();

5. Apache Commons Lang

Perpustakaan Apache Commons Lang menyediakan beberapa kaedah yang berguna dalam kelas StringUtils dan ArrayUtils yang boleh kita gunakan untuk bergabung dengan susunan primitif kita.

Untuk menggunakan perpustakaan ini, kita perlu menambahkan kebergantungan commons-lang3 ke pom.xml kami :

 org.apache.commons commons-lang3 3.8.1 

Semasa bekerja dengan pemisah String , kami akan memanfaatkan kedua StringUtils dan ArrayUtils .

Mari kita gunakan bersama-sama untuk bergabung dalam rangkaian int kami :

String joined = StringUtils.join(ArrayUtils.toObject(intArray), separator);

Atau, jika kita menggunakan jenis char primitif sebagai pemisah, kita hanya boleh menulis:

String joined = StringUtils.join(intArray, separatorChar);

Pelaksanaan untuk menyertai array char kami agak serupa:

String joined = StringUtils.join(ArrayUtils.toObject(charArray), separator);

Dan semasa menggunakan pemisah char :

String joined = StringUtils.join(charArray, separatorChar);

6. Jambu batu

Perpustakaan Jambu Batu Google menyediakan kelas Joiner yang dapat kita gunakan untuk bergabung dengan array kita. Untuk menggunakan Guava dalam projek kami, kami akan perlu menambah jambu Maven pergantungan:

 com.google.guava guava 27.0.1-jre 

Mari sertai array int kami menggunakan kelas Joiner :

String joined = Joiner.on(separator).join(Ints.asList(intArray));

Dalam contoh ini, kita juga menggunakan Ints.asList () kaedah dari Guava, yang baik mengubah pelbagai primitif ke dalam Senarai daripada Integer .

Jambu biji menawarkan kaedah yang serupa untuk menukar array char menjadi List of Character. Hasilnya, bergabung dengan array char kami sangat serupa dengan contoh di atas yang menggunakan array int :

String joined = Joiner.on(separator).join(Chars.asList(charArray));

7. StringBuilder

Akhirnya, jika kita tidak dapat menggunakan perpustakaan Java 8 atau pihak ketiga, kita dapat menggabungkan array elemen secara manual dengan StringBuilder . Dalam kes ini, pelaksanaannya sama untuk kedua-dua jenis susunan:

if (array.length == 0) { return ""; } StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < array.length - 1; i++) { stringBuilder.append(array[i]); stringBuilder.append(separator); } stringBuilder.append(array[array.length - 1]); String joined = stringBuilder.toString();

8. Kesimpulannya

Artikel ringkas ini menggambarkan beberapa cara untuk menggabungkan array primitif dengan watak atau rentetan pemisah yang diberikan. Kami menunjukkan contoh menggunakan penyelesaian JDK asli, serta penyelesaian tambahan menggunakan dua perpustakaan pihak ketiga - Apache Commons Lang dan Guava.

Seperti biasa, kod lengkap yang digunakan dalam artikel ini terdapat di GitHub.