You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java生成数组非空子集时,向List<List>添加List出现空列表求助

问题排查与修复:生成非空子集时结果为空列表

问题根源

你在fun方法中执行res.add(l)时,添加的是当前List对象的引用,而非独立的副本。由于递归过程中会对同一个l进行add和remove的回溯操作,所有后续修改都会影响已经存入res的引用。当整个递归结束时,l会被清空,最终res里的所有元素指向的都是这个空列表。

修复后代码

修改fun方法中添加子集的逻辑,每次添加时创建新的ArrayList副本,避免引用共享:

import java.util.*;
class test2{
    
    static void fun(int i,int arr[],List<Integer> l,int n,List<List<Integer>> res){
        if(i==n){
            if(l.size()!=0){
                // 创建新列表保存当前子集,与原列表解耦
                res.add(new ArrayList<>(l));
            }
            return;
        }
        l.add(arr[i]);
        fun(i+1,arr,l,n,res);
        l.remove(l.size()-1);
        fun(i+1,arr,l,n,res);
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int arr[]=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=sc.nextInt();
        }
        List<Integer> l=new ArrayList<>();
        List<List<Integer>> res=new ArrayList<>();
        fun(0,arr,l,n,res);
        System.out.println(res);
    }
}

修复说明

修改后,每次满足条件时都会生成一个独立的列表副本存入res,后续的回溯操作仅修改用于递归的临时列表l,不会影响已保存的子集,最终输出的就是所有非空子集的正确结果。

内容的提问来源于stack exchange,提问作者Sri Charan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:25:36