ArrayList> resultsList = new ArrayList>();
ArrayList path=new ArrayList();
resultsList.add(new ArrayList(path));
//resultsList.add(path);
ArrayList path=new ArrayList();
path已经有数据了,朝resultsList添加的时候,为什么还需要实例化path,而不是直接add(path);这样输出resultsList是空的
这个问题过去一年多了,我也是今天才遇到这个问题,查找资料的时候百度到这个问题,我已经解决,现在写下来,为后来者铺路!
我的问题来源于leetcode 题,使用回溯法,代码中有一段和楼主遇到的问题一模一样,最后竟然输出为空。
贴一下我的代码
class Solution {
List<List<Integer>> list = new ArrayList<List<Integer>>();
boolean[] used;
public List<List<Integer>> permute(int[] nums) {
if(nums == null || nums.length == 0){
return list;
}
used = new boolean[nums.length];
ArrayList<Integer> p = new ArrayList<Integer>();
generatePermutation(nums,0,p);
return list;
}
//p中保存有index个元素的全排列。这个方法的目的是向这个排列的末尾添加第index+1个元素,使p成为有index+1个元素的全排列
public void generatePermutation(int[] nums,int index,ArrayList<Integer> p){
if(index == nums.length ){
ArrayList<Integer> tem = new ArrayList<>();
tem.addAll(p);
list.add(tem);
return;
}
for(int i = 0 ; i < nums.length ; i++){
if(!used[i]){
p.add(nums[i]);
used[i] = true;
generatePermutation(nums,index+1,p);
p.remove(p.size()-1);
used[i] = false;
}
}
return;
}
}
在这个部分:
if(index == nums.length ){
ArrayList<Integer> tem = new ArrayList<>();
tem.addAll(p);
list.add(tem);
return;
}
改为
if(index == nums.length ){
list.add(p);
return;
}
输出就为空了。原因是:我们add(p),也就是楼主这里的add(path),我们这是将path的地址给add进去了,并没有将真正的列表add进热resultlist,这样导致的结果就是 当你的path中的值改变后,resultlist中也随之改变,楼主不出意外的话,你最后的path变为空了,所以最后输出全空。贴一段简单代码自己运行感受下:
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List<List<Integer>> res = new ArrayList<>();
System.out.println(res);
res.add(list);
list.add(50);
res.add(list);
System.out.println(res+"发现两个元素竟然一样");
可以直接add的,输出失控是什么意思?是指内容为空?还是指什么为空?
对于数组本身,new后确实实例化了,它的length等属性也可以使用。但是对于数组成员来说,如果需要实例化,还需要分别new。
是可以的 但是按你的写法 你打印的时候 得这样:
ArrayList resultsList = new ArrayList();
ArrayList path=new ArrayList();
path.add(2);
resultsList.add(path);
System.out.println(((ArrayList)resultsList.get(0)).get(0));
有问题 可以直接私信我
ArrayList里存放的是索引,,如果,直接add(path),,相当于添加了多个重复的path对象。
所以,,每次添加都需要 new创建新的对象。
如果,直接add(path),这样好像不行,
应该addAll(path);