Verifique se uma String é um Pangram em Java

Verifique se uma String é um Pangram em Java

1. Visão geral

Neste tutorial, aprenderemos a verificar se uma determinada string é um pangram válido ou não está usando um programa Java simples. Apangram is any string that contains all letters of a given alphabet set at least once.

2. Pangrams

Os pangramas são aplicáveis ​​não apenas ao idioma inglês, mas também a qualquer outro idioma com um conjunto de caracteres fixo.

Por exemplo, um pangram inglês comumente conhecido é "Uma rápida raposa marrom pula sobre o cachorro preguiçoso". Da mesma forma, eles também estão disponíveis em idiomasother.

3. Usando um loopfor

Primeiro, vamos tentar umhttps://www.example.com/java-loops.. Vamos preencher umBoolean array commarkers for each character of the alphabet.

O código retornatrue quando todos os valores na matriz do marcador são definidos comotrue:

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;
}

Vamos testar nossa implementação:

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

4. Usando Java Streams

Uma abordagem alternativa envolve o uso deJava Streams API. Podemoscreate a filtered character stream out of the given input text and create an alphabet Map using the stream.

O código retorna sucesso se o tamanho deMap for igual ao tamanho do alfabeto. Para o inglês, o tamanho esperado é 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 <= 'Z')))
      .mapToObj(c -> (char) c);

    Map alphabetMap =
      filteredCharStream.collect(Collectors.toMap(item -> item, k -> Boolean.TRUE, (p1, p2) -> p1));

    return alphabetMap.size() == ALPHABET_COUNT;
}

E, claro, vamos testar:

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

5. Modificando para pangrams perfeitos

Um pangram perfeito é um pouco diferente de um pangram comum. Aperfect pangram consists of each letter of the alphabet exactly once em oposição a pelo menos uma vez para um pangrama.

O código retornatrue quando o tamanhoMap é igual ao tamanho do alfabeto e a frequência de cada caractere do alfabeto é exatamente um:

public static boolean isPerfectPangram(String str) {
    if (str == null) {
        return false;
    }
    String strUpper = str.toUpperCase();

    Stream filteredCharStream = strUpper.chars()
        .filter(item -> ((item >= 'A' && item <= 'Z')))
        .mapToObj(c -> (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 vamos testar:

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

Um pangram perfeito deve ter cada caractere exatamente uma vez. Portanto, nosso pangram anterior deve falhar:

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

No código acima, a entrada de string fornecida tem várias duplicatas, como se tivesse dois o's. Portanto, a saída éfalse.

5. Conclusão

Neste artigo, cobrimos várias abordagens de solução para descobrir se uma determinada string é um pangrama válido ou não.

Também discutimos outro sabor de pangrams, chamado pangram perfeito, e como identificá-lo programaticamente.

A amostra de código está disponívelover on GitHub.