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
相关产品推荐
相关产品推荐

