Menghitung Kata dalam String dengan Java

1. Ikhtisar

Dalam tutorial ini, kita akan membahas berbagai cara menghitung kata dalam string tertentu menggunakan Java.

2. Menggunakan StringTokenizer

Cara sederhana untuk menghitung kata dalam string di Java adalah dengan menggunakan kelas StringTokenizer :

assertEquals(3, new StringTokenizer("three blind mice").countTokens()); assertEquals(4, new StringTokenizer("see\thow\tthey\trun").countTokens());

Perhatikan bahwa StringTokenizer secara otomatis menangani ruang kosong untuk kami , seperti tab dan carriage return.

Namun, ini mungkin salah di beberapa tempat, seperti tanda hubung:

assertEquals(7, new StringTokenizer("the farmer's wife--she was from Albuquerque").countTokens());

Dalam kasus ini, kita ingin kata "istri" dan "dia" menjadi kata yang berbeda, tetapi karena tidak ada spasi di antara keduanya, defaultnya mengecewakan kita.

Untungnya, StringTokenizer dikirimkan dengan konstruktor lain. Kita bisa meneruskan pembatas ke konstruktor untuk membuat pekerjaan di atas:

assertEquals(7, new StringTokenizer("the farmer's wife--she was from Albuquerque", " -").countTokens());

Ini berguna saat mencoba menghitung kata-kata dalam string dari sesuatu seperti file CSV:

assertEquals(10, new StringTokenizer("did,you,ever,see,such,a,sight,in,your,life", ",").countTokens());

Jadi, StringTokenizer itu sederhana, dan itu membawa kita sebagian besar ke sana.

Mari kita lihat meskipun ekspresi reguler tenaga kuda ekstra dapat memberi kita.

3. Ekspresi Reguler

Agar kita mendapatkan ekspresi reguler yang bermakna untuk tugas ini, kita perlu mendefinisikan apa yang kita anggap sebagai kata: sebuah kata dimulai dengan huruf dan diakhiri dengan karakter spasi atau tanda baca .

Dengan mengingat hal ini, jika diberi string, yang ingin kita lakukan adalah memisahkan string itu di setiap titik yang kita temukan spasi dan tanda baca, lalu menghitung kata yang dihasilkan.

assertEquals(7, countWordsUsingRegex("the farmer's wife--she was from Albuquerque"));

Mari kita tingkatkan sedikit untuk melihat kekuatan regex:

assertEquals(9, countWordsUsingRegex("no&one#should%ever-write-like,this;but:well"));

Tidak praktis untuk menyelesaikan masalah ini hanya dengan meneruskan pembatas ke StringTokenizer karena kita harus menentukan pembatas yang sangat panjang untuk mencoba dan mencantumkan semua kemungkinan tanda baca.

Ternyata kita benar-benar tidak perlu berbuat banyak, meneruskan regex [\ pP \ s && [^ ']] + ke metode pemisahan kelas String akan melakukan trik :

public static int countWordsUsingRegex(String arg) { if (arg == null) { return 0; } final String[] words = arg.split("[\pP\s&&[^']]+"); return words.length; }

Regex [\ pP \ s && [^ ']] + menemukan panjang apa pun dari tanda baca atau spasi dan mengabaikan tanda baca apostrof.

Untuk mengetahui lebih lanjut tentang ekspresi reguler, lihat Ekspresi Reguler di Baeldung.

4. Loop dan API String

Metode lainnya adalah memiliki bendera yang melacak kata-kata yang ditemukan.

Kami menyetel bendera ke WORD saat menemukan kata baru dan menambah jumlah kata, lalu kembali ke SEPARATOR saat kami menemukan non-kata (tanda baca atau karakter spasi).

Pendekatan ini memberi kita hasil yang sama dengan yang kita dapatkan dengan ekspresi reguler:

assertEquals(9, countWordsManually("no&one#should%ever-write-like,this but well")); 

Kami memang harus berhati-hati dengan kasus-kasus khusus di mana tanda baca sebenarnya bukan pemisah kata , misalnya:

assertEquals(6, countWordsManually("the farmer's wife--she was from Albuquerque"));

Yang kami inginkan di sini adalah menghitung kata "petani" sebagai satu kata, meskipun tanda kutip "'" adalah tanda baca.

Dalam versi regex, kami memiliki fleksibilitas untuk menentukan apa yang tidak memenuhi syarat sebagai karakter menggunakan regex. Tetapi sekarang setelah kita menulis implementasi kita sendiri, kita harus mendefinisikan pengecualian ini dalam metode terpisah :

private static boolean isAllowedInWord(char charAt)  

Jadi apa yang telah kami lakukan di sini adalah mengizinkan dalam satu kata semua karakter dan tanda baca resmi, apostrof dalam kasus ini.

Kami sekarang dapat menggunakan metode ini dalam implementasi kami:

public static int countWordsManually(String arg) { if (arg == null) { return 0; } int flag = SEPARATOR; int count = 0; int stringLength = arg.length(); int characterCounter = 0; while (characterCounter < stringLength) { if (isAllowedInWord(arg.charAt(characterCounter)) && flag == SEPARATOR) { flag = WORD; count++; } else if (!isAllowedInWord(arg.charAt(characterCounter))) { flag = SEPARATOR; } characterCounter++; } return count; }

Kondisi pertama menandai sebuah kata saat bertemu satu kata, dan menambah penghitung. Kondisi kedua memeriksa apakah karakter tersebut bukan huruf, dan menyetel bendera ke SEPARATOR .

5. Kesimpulan

Dalam tutorial ini, kami telah melihat cara menghitung kata menggunakan beberapa pendekatan. Kami dapat memilih tergantung pada kasus penggunaan khusus kami.

Seperti biasa, kode sumber untuk tutorial ini dapat ditemukan di GitHub.