Hitung Kejadian Char dalam Rentetan

1. Gambaran keseluruhan

Terdapat banyak cara untuk menghitung jumlah kejadian char dalam String di Java.

Dalam artikel ringkas ini, kita akan memfokuskan pada beberapa contoh cara menghitung watak, pertama, dengan perpustakaan inti Java dan kemudian dengan perpustakaan dan kerangka kerja lain seperti Spring dan Jambu.

2. Menggunakan Core Java Lib

2 .1. Pendekatan Imperatif

Sebilangan pemaju mungkin lebih suka menggunakan Java teras. Terdapat banyak cara untuk menghitung jumlah kejadian char dalam String.

Mari mulakan dengan pendekatan sederhana / naif:

String someString = "elephant"; char someChar = 'e'; int count = 0; for (int i = 0; i < someString.length(); i++) { if (someString.charAt(i) == someChar) { count++; } } assertEquals(2, count);

Tidak menghairankan ini akan berjaya, tetapi - juga tidak menghairankan - ada cara yang lebih baik untuk melakukan ini.

2.2. Menggunakan Rekursi

Penyelesaian yang kurang jelas, tetapi masih menarik adalah dengan menggunakan rekursi:

private static int countOccurences( String someString, char searchedChar, int index) { if (index >= someString.length()) { return 0; } int count = someString.charAt(index) == searchedChar ? 1 : 0; return count + countOccurences( someString, searchedChar, index + 1); }

Kita boleh menggunakan kaedah rekursif ini dengan cara berikut: useRecursionToCountChars ("gajah", 'e', ​​0)

2.4. Menggunakan Ungkapan Biasa

Cara lain ialah menggunakan ungkapan biasa:

Pattern pattern = Pattern.compile("[^e]*e"); Matcher matcher = pattern.matcher("elephant"); int count = 0; while (matcher.find()) { count++; } assertEquals(2, count);

Perhatikan bahawa penyelesaian ini betul secara teknikal, tetapi tidak optimum, kerana terlalu banyak menggunakan ungkapan biasa yang sangat kuat untuk menyelesaikan masalah sederhana seperti mencari jumlah kejadian watak dalam rentetan.

2.5. Menggunakan Ciri Java 8

Ciri-ciri baru yang terdapat di Java 8 sangat berguna di sini

Mari gunakan aliran dan lambdas untuk melaksanakan kiraan:

String someString = "elephant"; long count = someString.chars().filter(ch -> ch == 'e').count(); assertEquals(2, count); long count2 = someString.codePoints().filter(ch -> ch == 'e').count(); assertEquals(2, count2);

Jadi, ini jelas merupakan penyelesaian yang lebih bersih dan lebih mudah dibaca menggunakan inti perpustakaan.

3. Menggunakan Perpustakaan Luar

Sekarang mari kita lihat beberapa penyelesaian yang menggunakan utiliti dari perpustakaan luaran.

3.1. Menggunakan StringUtils

Secara umum, selalu lebih baik menggunakan penyelesaian yang ada daripada mencipta kaedah kita sendiri. The commons.lang.StringUtils kelas menyediakan kami dengan () countMatches kaedah, yang boleh digunakan untuk aksara kiraan atau sub-rentetan dalam diberikan String .

Pertama, kita perlu memasukkan kebergantungan yang sesuai:

 org.apache.commons commons-lang3 3.5 

Kita boleh mendapatkan versi terbaru di Maven Central.

Sekarang mari kita gunakan countMatches () untuk mengira bilangan watak 'e' dalam literal String "gajah":

int count = StringUtils.countMatches("elephant", "e"); assertEquals(2, count);

3.2. Menggunakan Jambu Batu

Jambu batu juga dapat membantu dalam menghitung karakter. Kita perlu menentukan pergantungan:

 com.google.guava guava 21.0 

Kita boleh mendapatkan versi terbaru di Maven Central.

Mari kita lihat bagaimana Jambu Batu dapat dengan cepat membantu kita mengira watak:

int count = CharMatcher.is('e').countIn("elephant"); assertEquals(2, count);

3.3. Menggunakan Musim Bunga

Sememangnya menambahkan Spring Framework ke dalam projek anda hanya untuk mengira watak tidak masuk akal. Walau bagaimanapun, jika kita sudah memilikinya dalam projek kita, kita hanya perlu menggunakan kaedah countOccurencesOf () :

int count = StringUtils.countOccurrencesOf("elephant", "e"); assertEquals(2, count);

4. Kesimpulan

Dalam tutorial ringkas ini, kami memfokuskan kepada pelbagai cara untuk menghitung watak dalam String. Sebahagian daripadanya dirancang semata-mata di Jawa; beberapa memerlukan perpustakaan tambahan.

Cadangan kami adalah menggunakan utiliti yang ada dari StringUtils , Jambu atau Musim Semi. Namun, jika seseorang lebih suka menggunakan Java biasa, artikel ini menawarkan beberapa kemungkinan untuk mencapai itu dengan baik dengan Java 8.

Kod sumber yang lengkap untuk contoh ini terdapat dalam projek GitHub ini.