1. 概述

在本篇文章中,我们将通过一个简单的 Java 程序来判断一个给定字符串是否为有效的 全字母句(Pangram)。所谓 全字母句 是指包含某个语言字母表中所有字母至少一次的字符串。

2. 全字母句简介

全字母句不仅适用于英语,也适用于任何具有固定字符集的语言。

例如,一个广为人知的英语全字母句是:

“A quick brown fox jumps over the lazy dog”

类似地,其他语言中也存在全字母句,比如这里就列出了一些。

3. 使用 for 循环实现

我们首先尝试使用 for 循环 来实现。基本思路是:

✅ 创建一个长度为 26 的布尔数组,用来标记每个字母是否出现过
✅ 遍历输入字符串,将出现的字母对应位置设为 true
✅ 最后检查布尔数组是否所有元素都为 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;
}

测试一下:

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

4. 使用 Java Streams 实现

我们也可以使用 Java Streams API 来实现。这种方式更现代化,也更函数式。

✅ 将字符串转为字符流
✅ 过滤掉非字母字符
✅ 使用 Collectors 收集为 Map,Key 为字符,Value 为布尔值
✅ 判断 Map 的大小是否等于 26(即是否包含所有字母)

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

    Stream<Character> filteredCharStream = strUpper.chars()
      .filter(item -> ((item >= 'A' && item <= 'Z')))
      .mapToObj(c -> (char) c);

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

    return alphabetMap.size() == ALPHABET_COUNT;
}

测试代码如下:

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

5. 完美全字母句(Perfect Pangram)的判断

完美全字母句比普通全字母句更严格一些。它的定义是:

✅ 包含字母表中每个字母 恰好一次

我们可以通过统计每个字母出现的次数来判断是否为完美全字母句:

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

    Stream<Character> filteredCharStream = strUpper.chars()
        .filter(item -> ((item >= 'A' && item <= 'Z')))
        .mapToObj(c -> (char) c);
    Map<Character, Long> alphabetFrequencyMap = 
      filteredCharStream.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

    return alphabetFrequencyMap.size() == ALPHABET_COUNT && 
      alphabetFrequencyMap.values().stream().allMatch(item -> item == 1);
}

测试完美全字母句:

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

测试普通全字母句(应返回 false):

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

⚠️ 因为该字符串中包含重复字母(如 o 出现两次),所以不是完美全字母句。

6. 总结

本文介绍了几种判断字符串是否为全字母句的方法,包括:

✅ 使用 for 循环 + 布尔数组标记
✅ 使用 Java Streams API 统计字母出现情况
✅ 判断完美全字母句(每个字母恰好出现一次)

所有代码示例都可以在 GitHub 仓库 中找到。


原始标题:Check if a String Is a Pangram in Java