Provjerite sadrži li niz sva slova abecede s Javom

1. Pregled

U ovom uputstvu vidjet ćemo kako provjeriti sadrži li niz sva slova abecede ili ne.

Evo kratkog primjera: “Farmer Jack shvatio je da su veliki žuti popluni skupi.”- koji zapravo sadrži sva slova abecede.

Razgovarat ćemo o tri pristupa.

Prvo ćemo algoritam modelirati koristeći imperativni pristup. Tada će se koristiti regularni izrazi. I na kraju, iskoristit ćemo deklarativniji pristup korištenjem Jave 8.

Uz to, razgovarat ćemo o velikoj složenosti poduzetih pristupa.

2. Imperativni algoritam

Provedimo imperativni algoritam. Za to ćemo prvo stvoriti booleov niz koji smo posjetili. Zatim ćemo proći kroz ulazni niz znak po znak i označiti ga kao posjećeni.

Imajte na umu da Velika slova i Mala slova smatraju se istim. Dakle, indeks 0 predstavlja i A i a, isto tako indeks 25 predstavlja i Z i z.

Na kraju ćemo provjeriti jesu li svi znakovi u posjećenom nizu postavljeni na true:

javna klasa EnglishAlphabetLetters {public static boolean checkStringForAllTheLetters (String input) {int index = 0; boolean [] posjećeno = novo 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'; } posjećeno [indeks] = točno; } za (int id = 0; id <26; id ++) {if (! posjećeno [id]) {return false; }} return true; }}

Velika-O-složenost ovog programa je O (n) gdje n je duljina niza.

Imajte na umu da postoji mnogo načina za optimizaciju algoritma, poput uklanjanja slova iz skupa i razbijanja čim Postavi prazno je. Ipak, u svrhu vježbe ovaj algoritam je dovoljno dobar.

3. Korištenje redovitog izražavanja

Koristeći Regularni izraz, lako možemo dobiti iste rezultate s nekoliko redaka koda:

javna statička logička provjeraStringForAllLetterUsingRegex (unos niza) {return input.toLowerCase () .replaceAll ("[^ az]", "") .replaceAll ("(.) (? =. * \ 1)", ""). dužina () == 26; }

Ovdje prvo uklanjamo sve znakove, osim abecednih slova, iz ulazni. Tada uklanjamo dvostruke znakove. Konačno, brojimo slova i pazimo da ih imamo, 26.

Iako manje učinkovit, velika složenost ovog pristupa također teži O (n).

4. Java 8 Stream

Korištenjem značajki Java 8 lako možemo postići isti rezultat na kompaktniji i deklarativniji način koristeći Stream filtar i različit metode:

javni statički logički checkStringForAllLetterUsingStream (String input) {long c = input.toLowerCase (). chars () .filter (ch -> ch> = 'a' && ch <= 'z') .distinct () .count (); povratak c == 26; }

Velika-O-složenost ovog pristupa također će biti O (n).

4. Ispitivanje

Isprobajmo sretan put za naš algoritam:

@Test javna praznina givenString_whenContainsAllCharacter_thenTrue () {String rečenica = "Farmer jack shvatio je da su veliki žuti popluni skupi"; assertTrue (EnglishAlphabetLetters.checkStringForAllTheLetters (rečenica)); }

Ovdje, rečenica sadrži sva slova abecede, stoga, očekujemo pravi kao rezultat.

5. Zaključak

U ovom smo uputstvu opisali kako provjeriti sadrži li niz sva slova abecede.

Vidjeli smo nekoliko načina kako to prvo primijeniti pomoću tradicionalnog imperativnog programiranja, regularnih izraza i Java 8 tokova.

Kompletni izvorni kod dostupan je na GitHubu.