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.