Provjerite je li niz Pangram na Javi

1. Pregled

U ovom uputstvu naučit ćemo provjeriti je li zadani niz valjan pangram ili ne, koristeći jednostavni Java program. A pangram je bilo koji niz koji barem jednom sadrži sva slova dane abecede.

2. Pangrami

Pangrami su primjenjivi ne samo na engleski jezik, već i na bilo koji drugi jezik koji ima fiksni skup znakova.

Na primjer, poznati engleski pangram je "Brza smeđa lisica preskoči lijenog psa". Slično tome, dostupni su i na drugim jezicima.

3. Korištenje a za Petlja

Prvo, probajmo a za petlja. Naselit ćemo a Booleova niz sa oznake za svaki znak abecede.

Kôd se vraća pravi kada su sve vrijednosti u polju markera postavljene na pravi:

javni statički logički isPangram (String str) {if (str == null) {return false; } Boolean [] alphabetMarker = novi logički podatak [ALPHABET_COUNT]; Nizovi.fill (alphabetMarker, false); int alphabetIndex = 0; str = str.toUpperCase (); for (int i = 0; i <str.length (); i ++) {if ('A' <= str.charAt (i) && str.charAt (i) <= 'Z') {alphabetIndex = str.charAt (i) - "A"; alphabetMarker [alphabetIndex] = true; }} za (logički indeks: alphabetMarker) {if (! indeks) {return false; }} return true; }

Isprobajmo našu implementaciju:

@Test javna praznina givenValidString_isPanagram_shouldReturnSuccess () {String input = "Dva pogođena jocka pomažu mi da faksiram moj veliki kviz"; assertTrue (Pangram.isPangram (ulaz)); }

4. Korištenje Java Streamova

Alternativni pristup uključuje upotrebu Java Streams API-ja. Možemo stvorite filtrirani tok znakova iz zadanog ulaznog teksta i stvorite abecedu Karta koristeći potok.

Kôd vraća uspjeh ako je veličina datoteke Karta jednaka je veličini abecede. Očekivana veličina za engleski jezik je 26:

javna statička logička vrijednost isPangramWithStreams (String str) {if (str == null) {return false; } Niz strUpper = str.toUpperCase (); Struja filteredCharStream = strUpper.chars () .filter (item -> ((item> = 'A' && item (char) c); Map alphabetMap = filteredCharStream.collect (Collectors.toMap (item -> item, k -> Boolean) .TRUE, (p1, p2) -> p1)); return alphabetMap.size () == ALPHABET_COUNT;}

I, naravno, testirajmo:

@Test javna praznina givenValidString_isPangramWithStreams_shouldReturnSuccess () {String input = "Brza smeđa lisica preskače lijenog psa"; assertTrue (Pangram.isPangramWithStreams (ulaz)); }

5. Modificiranje za savršene pangrame

Savršeni pangram malo se razlikuje od običnog pangrama. A savršeni pangram sastoji se od svakog slova abecede točno jednom za razliku od barem jednom za pangram.

Kôd se vraća pravi kad oboje Karta veličina jednaka je veličini abecede, a učestalost svakog znaka u abecedi je točno jedna:

javni statički logički isPerfectPangram (niz str) {if (str == null) {return false; } Niz strUpper = str.toUpperCase (); Potok filteredCharStream = strUpper.chars () .filter (item -> ((item> = 'A' && item (char) c); Map alphabetFrequencyMap = filteredCharStream.collect (Collectors.groupingBy (Function.identity (), Collectors.counting ())); return alphabetFrequencyMap.size () == ALPHABET_COUNT && alphabetFrequencyMap.values ​​(). stream (). allMatch (item -> item == 1);}

I testirajmo:

@Test javna praznina givenPerfectPangramString_isPerfectPangram_shouldReturnSuccess () {String input = "abcdefghijklmNoPqrStuVwxyz"; assertTrue (Pangram.isPerfectPangram (ulaz)); }

Savršeni pangram trebao bi imati svaki lik točno jednom. Dakle, naš prethodni pangram ne bi uspio:

String input = "Dva pogođena jocka pomažu mi da faksiram moj veliki kviz"; assertFalse (Pangram.isPerfectPangram (ulaz));

U gornjem kodu, zadani ulazni niz ima nekoliko duplikata, kao da ima dva o. Stoga je izlaz lažno.

5. Zaključak

U ovom smo članku pokrili različite pristupe rješenjima kako bismo saznali je li dati niz važeći pangram ili ne.

Također smo razgovarali o još jednom okusu pangrama koji se naziva savršeni pangram i kako ga programski prepoznati.

Uzorak koda dostupan je na GitHubu.