Ellenőrizze, hogy egy karakterlánc tartalmazza-e az Java ábécé összes betűjét

1. Áttekintés

Ebben az oktatóanyagban megtudhatjuk, hogyan lehet ellenőrizni, hogy egy karakterlánc tartalmazza-e az ábécé összes betűjét, vagy sem.

Itt egy rövid példa:Jack gazda rájött, hogy a nagy sárga paplanok drágák.”- amely valójában az ábécé összes betűjét tartalmazza.

Három megközelítést fogunk megvitatni.

Először imperatív megközelítéssel modellezzük az algoritmust. Ezután rendszeres kifejezéseket fog használni. És végül kihasználjuk a deklaratívabb megközelítés előnyeit a Java 8 használatával.

Ezenkívül megvitatjuk az alkalmazott megközelítések Big-O-komplexitását.

2. Kötelező algoritmus

Vezessünk be egy imperatív algoritmust. Ehhez először létrehozunk egy meglátogatott logikai tömböt. Ezután karakterenként követjük a beviteli karakterláncot, és meglátogatjuk a karaktert meglátogatottként.

Kérjük, vegye figyelembe, hogy Nagybetűs és Kisbetűs ugyanazoknak tekintik. Tehát a 0 index mind az A-t, mind az a-t jelöli, hasonlóan, a 25-es index mind Z-t, mind z-t.

Végül ellenőrizzük, hogy a meglátogatott tömb összes karaktere igaz-e:

public class EnglishAlphabetLetters {public static boolean checkStringForAllTheLetters (String input) {int index = 0; logikai [] meglátogatott = új logikai [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'; } meglátogatott [index] = igaz; } for (int id = 0; id <26; id ++) {if (! látogatott [id]) {return false; }} return true; }}

A program nagy-O-komplexitása O (n) ahol n a húr hossza.

Ne feledje, hogy az algoritmus optimalizálásának számos módja van, például a betűk eltávolítása a halmazból és a törés, amint a Készlet üres. A gyakorlat szempontjából ez az algoritmus azonban elég jó.

3. A reguláris kifejezés használata

A reguláris kifejezés használatával könnyen elérhetjük ugyanazokat az eredményeket néhány kódsorral:

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

Itt először az összes karaktert eltávolítjuk az ábécé betűit kivéve bemenet. Ezután eltávolítjuk az ismétlődő karaktereket. Végül megszámoljuk a leveleket, és megbizonyosodunk arról, hogy mindegyik megvan, 26.

Bár kevésbé teljesítő, a megközelítés Big-O-komplexitása O (n) -re is hajlamos.

4. Java 8 Stream

A Java 8 funkcióinak használatával könnyebben elérhetjük ugyanazt az eredményt kompaktabb és deklaratívabb módon a Stream's segítségével szűrő és különböző mód:

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

Ennek a megközelítésnek a nagy O-komplexitása szintén O (n) lesz.

4. Tesztelés

Teszteljünk egy boldog utat algoritmusunk számára:

@Test public void givenString_whenContainsAllCharacter_thenTrue () {String mondat = "A farmer gazda rájött, hogy a nagy sárga paplanok drágák"; assertTrue (EnglishAlphabetLetters.checkStringForAllTheLetters (mondat)); }

Itt, mondat az ábécé összes betűjét tartalmazza, ezért arra számítunk igaz ennek eredményeként.

5. Következtetés

Ebben az oktatóanyagban bemutattuk, hogyan lehet ellenőrizni, hogy egy karakterlánc tartalmazza-e az ábécé összes betűjét.

Pár módot láttunk ennek megvalósítására a hagyományos imperatív programozás, a reguláris kifejezések és a Java 8 folyamok használatával.

A teljes forráskód elérhető a GitHub oldalon.