你好,关于list集合添加集合对象的问题

你好,关于list集合添加集合对象的问题

您好,之前问过相关的问题,由于代码太长就没能贴出来继续询问,这是一个寻找一个数组所有子集的方法,请问在Solution类当中的backTrack方法中list.add(new ArrayList(temp));语句,为什么不能直接添加temp,而需要添加new ArrayList(temp)才能够得到正确结果呢?想问下这两个语法上有什么区别吗?

直接添加temp不会报错,但是最后得到结果是错误的,比如说输入数组 [1,2,3],正确结果为[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]],但是直接添加temp的话输出结果为[[],[],[],[],[],[],[],[]],不能得到正确结果


class Solution {

    public List<List<Integer>> subsets(int[] nums) {

        List<List<Integer>> list = new ArrayList<>();

        backTrack(0,nums,list,new ArrayList<Integer>());

        return list;

    }


    private void backTrack(int i, int[] nums, List<List<Integer>> list,                    ArrayList<Integer> temp){

     list.add(new ArrayList(temp));

     for(int j = i; j < nums.length; j++){

         temp.add(nums[j]);

         backTrack(j+1,nums,list,temp);

         temp.remove(temp.size() - 1);

     }

    }

}


public class MainClass {

    public static int[] stringToIntegerArray(String input) {

        input = input.trim();

        input = input.substring(1, input.length() - 1);

        if (input.length() == 0) {

          return new int[0];

        }

    

        String[] parts = input.split(",");

        int[] output = new int[parts.length];

        for(int index = 0; index < parts.length; index++) {

            String part = parts[index].trim();

            output[index] = Integer.parseInt(part);

        }

        return output;

    }

    

    public static String integerArrayListToString(List<Integer> nums, int length) {

        if (length == 0) {

            return "[]";

        }

    

        String result = "";

        for(int index = 0; index < length; index++) {

            Integer number = nums.get(index);

            result += Integer.toString(number) + ", ";

        }

        return "[" + result.substring(0, result.length() - 2) + "]";

    }

    

    public static String integerArrayListToString(List<Integer> nums) {

        return integerArrayListToString(nums, nums.size());

    }

    

    public static String int2dListToString(List<List<Integer>> nums) {

        StringBuilder sb = new StringBuilder("[");

        for (List<Integer> list: nums) {

            sb.append(integerArrayListToString(list));

            sb.append(",");

        }

    

        sb.setCharAt(sb.length() - 1, ']');

        return sb.toString();

    }

    

    public static void main(String[] args) throws IOException {

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        String line;

        while ((line = in.readLine()) != null) {

            int[] nums = stringToIntegerArray(line);

            

            List<List<Integer>> ret = new Solution().subsets(nums);

            

            String out = int2dListToString(ret);

            

            System.out.print(out);

        }

    }

}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕阿满 2019-11-23 14:12:15

同学你好,在backTrack()方法中增加了输出语句,如:

http://img1.sycdn.imooc.com//climg/5dd8cc020937bb7408980316.jpg

使用list.add(temp)时,测试[1,2]数组,输出结果为:

http://img1.sycdn.imooc.com//climg/5dd8cc0d09ed55a702660472.jpg

使用list.add(new ArrayList<Integer>(temp))时,输出结果为:

http://img1.sycdn.imooc.com//climg/5dd8cc6209b37f6902330452.jpg

在使用使用list.add(temp);最后list中的值为[]空集合,应该List和ArrayList中集合排序的问题,所以subsets()方法的返回值为空集合,最后输出对应子集个数的[]值。

祝:学习愉快~


  • 提问者 一只大猪蹄 #1
    老师,您看我理解的有问题没,根据您的测试结果,我理解的并不是说是List和ArrayList集合的排序问题,因为您用的List<Integer>创建的对象,而我贴出来的代码是ArrayList<Integer>创建的对象,我按照您的方法测试过后,直接添加temp结果仍旧是错误的,在您的提醒下,我发现,之所以结果错误,就是因为直接添加temp的问题,因为temp是一个引用数据类型,里面如果都添加temp的话,里面的对象指向同一片引用空间,那么到循环最后,temp的值是空的,导致里面所有的数组也都是空的。所以为什么空数组的个数能够对应上,而里面的值是错误的。
    2019-11-23 17:30:14
  • 好帮手慕阿满 回复 提问者 一只大猪蹄 #2
    同学理解的更准确些,继续加油。祝:学习愉快~
    2019-11-23 18:56:11
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师