移除字符串指定字符生成集合:代码输出不符合预期的排查求助
问题排查与修复:生成移除'C'后的目标字符串集合
核心问题
你的代码输出缺失CAA的根本原因是错误使用indexOf()获取要移除的字符位置:
- 当遍历字符串中的每个'C'时,你用
array.get(i).indexOf(a)去查找索引,但indexOf('C')只会返回字符串中第一个'C'的位置。 - 比如处理原字符串
CACA时,当遍历到第3个字符(索引2,是'C'),indexOf('C')仍然返回0,导致生成的是ACA而不是预期的CAA。重复的ACA后续被HashSet去重,最终结果就少了CAA。
另外,遍历集合时动态往里面加元素会导致循环次数不可控,但这不是本次结果缺失的主要原因。
修复后的代码
把获取移除索引的逻辑改成直接用当前遍历的j,同时简化字符串拼接的逻辑:
import java.util.ArrayList; import java.util.HashSet; public class Main { public static void main(String[] args) { ArrayList<String> array = new ArrayList<>(); array.add("CACA"); char targetChar = 'C'; // 先复制初始集合作为待处理列表,避免遍历过程中新增元素干扰循环 ArrayList<String> toProcess = new ArrayList<>(array); for (String currentStr : toProcess) { for (int j = 0; j < currentStr.length(); j++) { if (currentStr.charAt(j) == targetChar) { // 移除当前j位置的'C' String newStr = currentStr.substring(0, j) + currentStr.substring(j + 1); array.add(newStr); } } } // 去重(如果需要保持插入顺序,可改用LinkedHashSet) HashSet<String> uniqueSet = new HashSet<>(array); array.clear(); array.addAll(uniqueSet); System.out.print(array); } }
修复说明
- 用当前遍历索引j代替indexOf:确保每个'C'的位置都被正确处理,处理
CACA时会生成ACA(移除索引0的'C')和CAA(移除索引2的'C')。 - 使用待处理列表隔离遍历过程:避免在遍历原集合时新增元素导致重复处理,确保每个初始和新生成的字符串都只被处理一次。
- 简化字符串拼接逻辑:不管'C'在什么位置,直接通过
substring拼接移除后的字符串,代码更简洁。
运行修复后的代码,输出就是预期的[CACA, ACA, CAA, AA]。
内容的提问来源于stack exchange,提问作者User2000
相关产品推荐
相关产品推荐

