You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java8查找字母表(a-z/A-Z)中缺失的字符

问题

实现需求:找出给定字符串中缺失的小写英文字母,尝试通过Stream API的filter、distinct等操作实现时,无法得到符合预期的输出。
测试用例信息:

  • 输入参数:String input = "abc";
  • 预期输出:"defghijklmnopqrstuvwxyz",即a-z字母表中d到z的所有连续小写字母。
正确实现代码

核心思路是先遍历a到z的完整字母序列,剔除输入字符串中已经存在的字符,剩余部分拼接即为结果,不需要多余的去重逻辑。

import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class MissingLetterUtil {
    public static String getMissingAlphabets(String input) {
        // 先将输入包含的字符存入Set,后续存在性判断时间复杂度为O(1)
        var charSet = input.chars()
                .boxed()
                .collect(Collectors.toSet());

        // 遍历a-z全量字母,过滤已存在字符后拼接
        return IntStream.rangeClosed('a', 'z')
                .filter(c -> !charSet.contains(c))
                .mapToObj(c -> String.valueOf((char) c))
                .collect(Collectors.joining());
    }

    public static void main(String[] args) {
        String input = "abc";
        // 执行输出为defghijklmnopqrstuvwxyz,完全匹配预期
        System.out.println(getMissingAlphabets(input));
    }
}
实现注意事项
  • 无需额外调用distinct操作:a-z本身是无重复的连续字符序列,输入字符存入Set时已经完成去重,额外加去重逻辑只会产生无意义的性能损耗
  • 避免直接用String.contains()做过滤判断:该方法每次执行都要遍历整个输入字符串,输入较长时性能远差于Set判断,且传char类型参数时容易触发类型转换错误
  • 注意类型转换:IntStream.rangeClosed('a', 'z')生成的是字母对应的ASCII整数值,拼接前需要强转为char类型,否则会输出数字序列而非字母

内容的提问来源于stack exchange,提问作者Brijesh Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:57:19