wuming无名 2017-08-15 04:37 采纳率: 20%
浏览 5646
已结题

ArrayList<ArrayList<Integer>>的add函数

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是空的

  • 写回答

7条回答 默认 最新

  • 星夜丶晚晚 2019-04-19 11:18
    关注

    这个问题过去一年多了,我也是今天才遇到这个问题,查找资料的时候百度到这个问题,我已经解决,现在写下来,为后来者铺路!
    我的问题来源于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+"发现两个元素竟然一样");
    
    评论

报告相同问题?

悬赏问题

  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题