Controlla se una stringa è un Pangram in Java

1. Panoramica

In questo tutorial impareremo a verificare se una data stringa è pangram valida o meno utilizzando un semplice programma Java. Un pangram è una stringa che contiene almeno una volta tutte le lettere di un determinato alfabeto.

2. Pangram

I pangram sono applicabili non solo alla lingua inglese, ma anche a qualsiasi altra lingua con un set di caratteri fisso.

Ad esempio, un pangram inglese comunemente noto è "Una volpe marrone veloce salta sul cane pigro". Allo stesso modo, questi sono disponibili anche in altre lingue.

3. Usare un ciclo for

Per prima cosa, proviamo un ciclo for . Popoleremo un array booleano con marcatori per ogni carattere dell'alfabeto.

Il codice restituisce true quando tutti i valori nella matrice di marker sono impostati su true :

public static boolean isPangram(String str) { if (str == null) { return false; } Boolean[] alphabetMarker = new Boolean[ALPHABET_COUNT]; Arrays.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; } } for (boolean index : alphabetMarker) { if (!index) { return false; } } return true; }

Testiamo la nostra implementazione:

@Test public void givenValidString_isPanagram_shouldReturnSuccess() { String input = "Two driven jocks help fax my big quiz"; assertTrue(Pangram.isPangram(input)); }

4. Utilizzo di Java Streams

Un approccio alternativo prevede l'utilizzo dell'API Java Streams. Possiamo creare un flusso di caratteri filtrato dal testo di input fornito e creare una mappa alfabetica utilizzando il flusso .

Il codice restituisce successo se la dimensione della mappa è uguale alla dimensione dell'alfabeto. Per l'inglese, la dimensione prevista è 26:

public static boolean isPangramWithStreams(String str) { if (str == null) { return false; } String strUpper = str.toUpperCase(); Stream 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; }

E, naturalmente, testiamo:

@Test public void givenValidString_isPangramWithStreams_shouldReturnSuccess() { String input = "The quick brown fox jumps over the lazy dog"; assertTrue(Pangram.isPangramWithStreams(input)); }

5. Modifica per Pangram perfetti

Un pangram perfetto è leggermente diverso da un pangram normale. Un pangram perfetto consiste di ciascuna lettera dell'alfabeto esattamente una volta rispetto ad almeno una volta per un pangram.

Il codice restituisce vero quando sia la dimensione della mappa è uguale alla dimensione dell'alfabeto sia la frequenza di ogni carattere dell'alfabeto è esattamente uno:

public static boolean isPerfectPangram(String str) { if (str == null) { return false; } String strUpper = str.toUpperCase(); Stream 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); }

E proviamo:

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

Un pangram perfetto dovrebbe avere ogni carattere esattamente una volta. Quindi, il nostro precedente pangram dovrebbe fallire:

String input = "Two driven jocks help fax my big quiz"; assertFalse(Pangram.isPerfectPangram(input));

Nel codice sopra, la stringa di input fornita ha diversi duplicati, come se avesse due o. Quindi l'output è falso .

5. conclusione

In questo articolo, abbiamo coperto vari approcci di soluzione per scoprire se una determinata stringa è un pangram valido o meno.

Abbiamo anche discusso un altro tipo di pangram che si chiama pangram perfetto e come identificarlo a livello di codice.

L'esempio di codice è disponibile su GitHub.