Java递归方法ArrayList参数错误:如何修正一行式调用问题
问题分析与解决方案
错误原因
你遇到的类型不匹配错误,核心问题在于:
storage.add(...)返回布尔值(表示元素是否成功添加),但conxFinder第一个参数需要的是ArrayList类型,直接传递返回值会导致类型不匹配。linArray.remove(i)返回的是被移除的ArrayList<String>对象,而方法第二个参数需要的是linArray本身(ArrayList<ArrayList<String>>类型),类型完全不符。- 更关键的是:如果先执行
linArray.remove(i)再调用linArray.get(i).get(a),会因为索引i的元素已被移除,直接抛出IndexOutOfBoundsException,这和你拆分步骤的逻辑完全冲突。
一行式解决方案
由于Java没有类似C语言的逗号表达式,无法在单个参数位置执行多个操作并返回目标类型,最接近你需求的"一行式"写法是用分号将临时变量赋值和方法调用合并到同一行,同时严格保留原拆分步骤的执行顺序:
String newLinInit = linArray.get(i).get(a); conxFinder(storage, (storage.add(linArray.get(i).get(0)), linArray).remove(i) != null ? linArray : linArray, newLinInit, linFin);
或者更直白的一行写法(本质是将多行语句用分号连在一起):
storage.add(linArray.get(i).get(0)); String newLinInit = linArray.get(i).get(a); linArray.remove(i); conxFinder(storage, linArray, newLinInit, linFin);
如果严格要求"单个方法调用语句",可以封装一个辅助方法来完成前置操作:
// 辅助方法:执行修改操作并返回新的linInit private static String prepareConxParams(ArrayList storage, ArrayList<ArrayList<String>> linArray, int i, int a) { storage.add(linArray.get(i).get(0)); String newLinInit = linArray.get(i).get(a); linArray.remove(i); return newLinInit; } // 一行式递归调用 conxFinder(storage, linArray, prepareConxParams(storage, linArray, i, a), linFin);
内容的提问来源于stack exchange,提问作者BlueInundation
相关产品推荐
相关产品推荐

