Periksa Jika String Mengandungi Semua Huruf Abjad dengan Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat bagaimana untuk memeriksa apakah String mengandungi semua huruf abjad atau tidak.

Inilah contoh ringkas: “ Jack petani menyedari bahawa selimut kuning besar itu mahal. "- yang sebenarnya mengandungi semua huruf abjad.

Kami akan membincangkan tiga pendekatan.

Pertama, kita akan memodelkan algoritma menggunakan pendekatan penting. Kemudian akan menggunakan ungkapan biasa. Dan akhirnya, kami akan memanfaatkan pendekatan yang lebih deklaratif menggunakan Java 8.

Selain itu, kita akan membincangkan kerumitan pendekatan Big-O.

2. Algoritma Imperatif

Mari laksanakan algoritma penting. Untuk ini, pertama, kami akan membuat susunan boolean yang dikunjungi. Kemudian, kita akan melihat rentetan input mengikut watak dan menandakan watak tersebut semasa dikunjungi.

Sila ambil perhatian bahawa Huruf Besar dan Huruf Kecil dianggap sama. Jadi indeks 0 mewakili kedua-dua A dan a, begitu juga, indeks 25 mewakili kedua-dua Z dan z.

Akhirnya, kami akan memeriksa sama ada semua watak dalam susunan yang dikunjungi ditetapkan menjadi benar:

public class EnglishAlphabetLetters { public static boolean checkStringForAllTheLetters(String input) { int index = 0; boolean[] visited = new boolean[26]; for (int id = 0; id < input.length(); id++) { if ('a' <= input.charAt(id) && input.charAt(id) <= 'z') { index = input.charAt(id) - 'a'; } else if ('A' <= input.charAt(id) && input.charAt(id) <= 'Z') { index = input.charAt(id) - 'A'; } visited[index] = true; } for (int id = 0; id < 26; id++) { if (!visited[id]) { return false; } } return true; } }

Kerumitan besar-O program ini adalah O (n) di mana n adalah panjang tali.

Perhatikan bahawa terdapat banyak cara untuk mengoptimumkan algoritma, seperti mengeluarkan huruf dari satu set dan pecah sebaik sahaja Set itu kosong. Walau bagaimanapun, untuk tujuan latihan, algoritma ini cukup baik.

3. Menggunakan Ungkapan Biasa

Dengan menggunakan ungkapan biasa, kita dapat memperoleh hasil yang sama dengan beberapa baris kod:

public static boolean checkStringForAllLetterUsingRegex(String input) { return input.toLowerCase() .replaceAll("[^a-z]", "") .replaceAll("(.)(?=.*\\1)", "") .length() == 26; }

Di sini, pertama-tama kita menghapuskan semua watak kecuali huruf abjad dari input . Kemudian kami membuang watak pendua. Akhirnya, kami mengira huruf dan memastikan bahawa kami mempunyai semua surat, 26.

Walaupun kurang berprestasi, Kerumitan Besar-O pendekatan ini juga cenderung kepada O (n).

4. Java 8 Stream

Dengan menggunakan ciri Java 8, kita dapat memperoleh hasil yang sama dengan cara yang lebih padat dan deklaratif menggunakan penapis Stream dan kaedah yang berbeza :

public static boolean checkStringForAllLetterUsingStream(String input) { long c = input.toLowerCase().chars() .filter(ch -> ch >= 'a' && ch <= 'z') .distinct() .count(); return c == 26; }

Kerumitan besar-O pendekatan ini juga akan menjadi O (n).

4. Ujian

Mari menguji jalan senang untuk algoritma kami:

@Test public void givenString_whenContainsAllCharacter_thenTrue() { String sentence = "Farmer jack realized that big yellow quilts were expensive"; assertTrue(EnglishAlphabetLetters.checkStringForAllTheLetters(sentence)); }

Di sini, kalimat mengandungi semua huruf abjad, oleh itu, kami mengharapkan benar sebagai hasilnya.

5. Kesimpulan

Dalam tutorial ini, kami telah membahas bagaimana untuk memeriksa apakah String mengandungi semua huruf abjad .

Kami melihat beberapa cara untuk melaksanakannya terlebih dahulu menggunakan pengaturcaraan imperatif tradisional, ungkapan biasa, dan aliran Java 8.

Kod sumber lengkap boleh didapati di GitHub.