Skontrolujte, či je reťazec v jazyku Java pangram

1. Prehľad

V tomto návode sa naučíme skontrolovať, či je daný reťazec platný pangram alebo či nepoužíva jednoduchý program Java. A pangram je akýkoľvek reťazec, ktorý obsahuje aspoň raz všetky písmená danej abecedy.

2. Pangramy

Pangramy sú použiteľné nielen v anglickom jazyku, ale aj v akomkoľvek inom jazyku, ktorý má pevnú znakovú sadu.

Napríklad všeobecne známy anglický pangram je „Rýchla hnedá líška preskočí lenivého psa“. Podobne sú k dispozícii aj v iných jazykoch.

3. Pomocou a pre Slučka

Najskôr skúsme a pre slučka. Naplníme a Boolovský pole s značky pre každý znak abecedy.

Kód sa vráti pravda keď sú všetky hodnoty v poli značiek nastavené na pravda:

public static boolean isPangram (String str) {if (str == null) {return false; } Boolean [] alphabetMarker = nový Boolean [ALPHABET_COUNT]; Arrays.fill (alphabetMarker, false); int alphabetIndex = 0; str = str.toUpperCase (); pre (int i = 0; i <str.length (); i ++) {if ('A' <= str.charAt (i) && str.charAt (i) <= 'Z') {alphabetIndex = str.charAt i) - „A“; alphabetMarker [alphabetIndex] = true; }} pre (boolean index: alphabetMarker) {if (! index) {return false; }} návrat true; }

Vyskúšajme našu implementáciu:

@Test public void givenValidString_isPanagram_shouldReturnSuccess () {String input = "Dvaja riadení atléti pomáhajú faxovať môj veľký kvíz"; assertTrue (Pangram.isPangram (vstup)); }

4. Používanie streamov Java

Alternatívny prístup zahŕňa použitie rozhrania Java Streams API. Môžeme vytvorte z daného vstupného textu filtrovaný prúd znakov a vytvorte abecedu Mapa pomocou streamu.

Kód vráti úspech, ak je veľkosť súboru Mapa sa rovná veľkosti abecedy. Pre angličtinu je očakávaná veľkosť 26:

public static boolean isPangramWithStreams (String str) {if (str == null) {return false; } Reťazec strUpper = str.toUpperCase (); Stream filtrovanýCharStream = strUpper.chars () .filter (item -> ((item> = 'A' && item (char) c); Map alphabetMap =filtrCharStream.collect (Collectors.toMap (item -> item, k -> Boolean) .TRUE, (p1, p2) -> p1)); return alphabetMap.size () == ALPHABET_COUNT;}

A samozrejme otestujme:

@Test public void givenValidString_isPangramWithStreams_shouldReturnSuccess () {String input = "Rýchla hnedá líška preskočí lenivého psa"; assertTrue (Pangram.isPangramWithStreams (vstup)); }

5. Úpravy pre dokonalé pangramy

Perfektný pangram je trochu iný ako bežný pangram. A Perfect Pangram sa skladá z každého písmena abecedy presne raz na rozdiel od najmenej raz za pangram.

Kód sa vráti pravda keď obaja Mapa veľkosť sa rovná veľkosti abecedy a frekvencia každého znaku v abecede je presne jedna:

public static boolean isPerfectPangram (String str) {if (str == null) {return false; } Reťazec strUpper = str.toUpperCase (); Stream filtrovanýCharStream = strUpper.chars () .filter (item -> ((item> = 'A' && item (char) c); Map alphabetFrequencyMap =filtrCharStream.collect (Collectors.groupingBy (Function.identity (), Collectors.counting) ())); return alphabetFrequencyMap.size () == ALPHABET_COUNT && alphabetFrequencyMap.values ​​(). stream (). allMatch (item -> item == 1);}

A otestujme:

@Test public void givenPerfectPangramString_isPerfectPangram_shouldReturnSuccess () {String input = "abcdefghijklmNoPqrStuVwxyz"; assertTrue (Pangram.isPerfectPangram (vstup)); }

Dokonalý pangram by mal mať každú postavu presne raz. Náš predchádzajúci pangram by teda mal zlyhať:

Reťazcový vstup = "Dva poháňané atléti pomáhajú faxovať môj veľký kvíz"; assertFalse (Pangram.isPerfectPangram (vstup));

Vo vyššie uvedenom kóde má daný reťazcový vstup niekoľko duplikátov, napríklad dve o. Preto je výstup nepravdivé.

5. Záver

V tomto článku sme sa venovali rôznym prístupom k riešeniam, aby sme zistili, či je daný reťazec platným pangramom alebo nie.

Diskutovali sme tiež o jednej ďalšej príchuti pangramov, ktorá sa nazýva dokonalý pangram a ako ju programovo identifikovať.

Ukážka kódu je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found