Java如何基于第二个字符串筛选第一个字符串的无重复独有字符
问题排查
你的代码存在以下几个核心错误:
- 内层取str1字符的索引写错:
str1.charAt(i)应该改为str1.charAt(j),你一直用外层循环的i变量取str1的字符,i只在0~3(str2长度是4)之间变化,所以只会重复取str1前4个字符,导致输出全是重复的n、d、i。 - 循环逻辑倒置:你外层遍历str2、内层遍历str1,相当于每对比一个str2的字符,就把整段str1的字符加一遍到结果里,重复次数直接和str2长度挂钩,完全不符合筛选逻辑。
- 没有去重逻辑:即使索引改对,也会把str1里重复出现的符合条件的字符多次加入结果,达不到要求的无重复输出。
- 判断逻辑写反:你现在的逻辑是只要和当前str2的字符不等就加,哪怕这个字符在str2的其他位置存在也会被加,完全没实现「筛选str2不含有的字符」的需求。
修复后可运行代码
import java.util.HashSet; import java.util.Set; public class FilterCharTest { public static void main (String [] arg) { String str1 = "India is a great country"; String str2 = "Isgt"; StringBuilder result = new StringBuilder(); // 先把str2转成全小写字符集合,方便快速判断是否存在,且不区分大小写 Set<Character> str2CharSet = new HashSet<>(); for (char c : str2.toCharArray()) { str2CharSet.add(Character.toLowerCase(c)); } // 存储已经加入结果的字符,用于去重 Set<Character> addedChar = new HashSet<>(); for (char c : str1.toCharArray()) { // 跳过空格 if (c == ' ') { continue; } char lowerC = Character.toLowerCase(c); // 只有str2不含该字符、且还没加入过结果的才添加 if (!str2CharSet.contains(lowerC) && !addedChar.contains(lowerC)) { result.append(c); addedChar.add(lowerC); } } System.out.println("输出结果: " + result); } }
运行后输出:输出结果: ndarecouy,完全符合预期。
内容的提问来源于stack exchange,提问作者Rajesh Jeedimalla
相关产品推荐
相关产品推荐

