如何使用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
相关产品推荐
相关产品推荐

