如何用Java递归统计嵌套列表中奇偶长度列表的数量
递归统计嵌套列表中奇偶长度列表的数量
看起来你已经有了一个不错的开头,接下来咱们把这个递归方法补全,实现统计嵌套列表中所有列表(包括外层和所有内层子列表)的奇偶长度数量。
核心思路
- 先统计当前列表本身:不管是不是嵌套结构,传入的当前列表本身就是需要统计的对象之一,先判断它的长度奇偶性,更新计数。
- 递归处理子列表:遍历列表中的每个元素,如果元素是
List类型,就递归调用统计方法,把返回的子列表奇偶计数累加到当前结果中。 - 忽略非列表元素:只有
List类型的元素需要处理,其他类型(比如整数、字符串)直接跳过即可。
完整实现代码
import java.util.List; public class MyRekursion { // 返回格式:[奇数长度列表的数量, 偶数长度列表的数量] public static int[] countOddEven(List<Object> nestedList) { int odd = 0; int even = 0; // 第一步:统计当前列表的长度奇偶性 if (nestedList.size() % 2 == 1) { odd++; } else { even++; } // 第二步:遍历元素,递归处理嵌套子列表 for (Object obj : nestedList) { if (obj instanceof List) { // 强制转换为List<Object>,添加注解抑制泛型擦除带来的unchecked警告 @SuppressWarnings("unchecked") List<Object> subList = (List<Object>) obj; // 递归调用获取子列表的统计结果 int[] subResult = countOddEven(subList); // 累加子结果到当前计数 odd += subResult[0]; even += subResult[1]; } // 非List类型元素直接忽略,不参与统计 } return new int[] { odd, even }; } // 测试用例,验证逻辑正确性 public static void main(String[] args) { // 构造嵌套列表:[[1,2], [3], [[4,5,6]]] List<Object> testList = List.of( List.of(1, 2), List.of(3), List.of(List.of(4,5,6)) ); int[] result = countOddEven(testList); System.out.println("奇数长度列表数量:" + result[0]); // 输出4 System.out.println("偶数长度列表数量:" + result[1]); // 输出1 } }
测试用例说明
我们来拆解测试用例的统计过程,确保你理解每一步:
- 最外层列表长度3 → 奇数,
odd=1 - 子列表
[1,2]长度2 → 偶数,even=1 - 子列表
[3]长度1 → 奇数,odd=2 - 子列表
[[4,5,6]]长度1 → 奇数,odd=3- 它的子列表
[4,5,6]长度3 → 奇数,odd=4
- 它的子列表
最终得到的结果是[4,1],和代码输出一致。
注意事项
- 空列表处理:空列表长度为0,会被统计为偶数长度列表。
- 泛型警告:由于Java泛型的类型擦除,强制转换时会出现
unchecked警告,添加@SuppressWarnings("unchecked")是安全的,因为我们已经通过instanceof List确认了元素类型。 - 非列表元素:嵌套列表中的非
List类型元素不会影响统计结果,只会被跳过。
内容的提问来源于stack exchange,提问作者Huy Tran
相关产品推荐
相关产品推荐

