Java函数式按字符串长度分组方法转递归实现的问题排查
问题原因
- 递归分支重复执行:原代码中每处理完一个元素的
ii+1递归返回后,都会额外触发一次i+1的递归调用,导致外层列表的同一个子列表会被遍历多次,元素被重复插入Map的对应列表中。 - 冗余参数逻辑错误:传递的临时列表
ls完全没有必要作为递归参数,Map中已经存储了各个字符串长度对应的列表实例,直接从Map读取操作即可,原逻辑中多余的列表参数也增加了逻辑混乱的概率。
修复后的代码
public static Map<Integer,List<String>> recursiva(List<List<String>> listas){ return recursivaAux(listas, 0, 0, new HashMap<>()); } private static Map<Integer,List<String>> recursivaAux(List<List<String>> listas, int i, int ii, Map<Integer,List<String>> res){ // 终止条件:所有外层列表遍历完成 if (i >= listas.size()) { return res; } List<String> currentSubList = listas.get(i); // 当前子列表遍历完成,递归处理下一个外层元素 if (ii >= currentSubList.size()) { return recursivaAux(listas, i + 1, 0, res); } // 处理当前元素 String word = currentSubList.get(ii); int length = word.length(); // 不存在对应长度的列表就新建,否则直接追加 res.computeIfAbsent(length, k -> new ArrayList<>()).add(word); // 递归处理当前子列表的下一个元素 return recursivaAux(listas, i, ii + 1, res); }
内容的提问来源于stack exchange,提问作者famvcucu
相关产品推荐
相关产品推荐

