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.