Java中如何优化含g/d单词处理逻辑?解决空if语句问题
问题分析与解决方案
原代码核心问题
- 仅处理了列表第一个元素
k1,其余k2-k5未执行任何逻辑,不符合“处理单词列表”的需求 - 遍历单词每个字符时,每遇到一个
g就执行一次add、遇到d就执行一次remove,导致重复操作(比如单词"ggg"会被重复添加多次) - 第三个空
if完全多余,原逻辑方向错误——应该先判断整个单词是否同时包含g和d,而非逐个字符判断后做无意义分支
正确实现思路
根据需求,每个单词只需做一次判断:
- 若单词同时包含
'g'和'd':忽略 - 若仅包含
'g':复制该单词(添加到列表) - 若仅包含
'd':删除该单词 - 都不包含:无操作
同时,直接遍历原列表并修改会触发ConcurrentModificationException,需通过复制列表来规避。
优化后的代码
private static void fix(List<String> hg) { // 复制原列表,避免遍历原列表时修改引发异常 List<String> tempList = new ArrayList<>(hg); for (String word : tempList) { boolean hasG = word.contains("g"); boolean hasD = word.contains("d"); if (hasG && hasD) { // 同时含g和d,忽略 continue; } if (hasG) { // 仅含g,复制单词 hg.add(word); } else if (hasD) { // 仅含d,删除单词 hg.remove(word); } } }
原代码中“空if”的处理
原代码里的第三个if (r.equals('g') || r.equals('d'))是错误逻辑下的产物,在重构后的代码中直接删除即可——因为我们不需要逐个字符判断后做分支,而是先对整个单词做一次性判断,既避免了重复操作,也消除了无意义的空分支。
补充:保留字符遍历的实现方式
如果必须保留逐个字符遍历的逻辑(比如有其他未说明的需求),可以改为遍历字符时标记是否存在g和d,遍历完单词后统一执行操作,避免重复触发增删:
private static void fix(List<String> hg) { List<String> tempList = new ArrayList<>(hg); for (String word : tempList) { boolean hasG = false; boolean hasD = false; // 遍历单词字符,标记是否存在g和d for (char c : word.toCharArray()) { if (c == 'g') { hasG = true; } else if (c == 'd') { hasD = true; } // 提前终止遍历:一旦同时找到g和d,无需继续 if (hasG && hasD) { break; } } // 根据标记执行操作 if (hasG && hasD) { continue; } if (hasG) { hg.add(word); } else if (hasD) { hg.remove(word); } } }
内容的提问来源于stack exchange,提问作者SecurityAlert
相关产品推荐
相关产品推荐

