【问题标题】:Passing new ArrayList vs Passing ArrayList as a parameter in Function(Java)传递新的 ArrayList 与传递 ArrayList 作为函数(Java)中的参数
【发布时间】:2021-07-22 12:02:58
【问题描述】:

请帮助我了解其中的区别。就像在第一个代码 sn-p 中一样,我在第 1 行和第 2 行的递归函数中将更新的 ArrayList 作为参数传递。 这给了我错误的答案。

public static void rootToLeafPaths(TreeNode node, ArrayList<Integer> sub){
        if(node == null)
            return;
        sub.add(node.val);
        if(node.left == null && node.right == null){
            list.add(sub);
            return;
        }
        rootToLeafPaths(node.left,sub); //LINE 1
        rootToLeafPaths(node.right,sub); //LINE 2
        sub.remove(sub.size()-1);    
    }

在第二个代码 sn-p 中,我传递了一个新创建的 ArrayList(在第 3 行和第 4 行),它给了我正确的答案。

public static void rootToLeafPaths(TreeNode node, ArrayList<Integer> sub){
            if(node == null)
                return;
            sub.add(node.val);
            if(node.left == null && node.right == null){
                list.add(sub);
                return;
            }
            rootToLeafPaths(node.left,new ArrayList<Integer> (sub)); // LINE 3
            rootToLeafPaths(node.right,new ArrayList<Integer> (sub)); // LINE 4
            sub.remove(sub.size()-1);    
    }

帮助我了解其中的区别。

这个方法应该提供二叉树的根到叶路径。就像在第一种情况下,它给我 [[1, 2, 4], [1, 2, 4], [1, 2, 4]] 作为输出,这是错误的,但是当我传递一个新创建的 ArrayList 时它给我 [[1, 2, 4, 6, 8], [1, 2, 5, 7, 9, 10], [1, 3]] 作为正确输出的时间

简短摘要(基于答案):即使我们将列表分配给其他列表(例如:列表列表 = 列表 2),我们也会将引用分配给它。所以两者都将指向同一个列表。一个人的变化将反映在另一个人身上。所以为了解决这个问题,我们需要通过 (List list = new ArrayList(list2);) 来创建另一个列表

【问题讨论】:

  • 正确答案是什么?该方法应该做什么?
  • @khelwood 这个方法应该提供二叉树的根到叶路径。就像在第一种情况下,它给我 [[1, 2, 4], [1, 2, 4], [1, 2, 4]] 作为输出,这是错误的,但是当我传递一个新创建的 ArrayList 时它给我 [[1, 2, 4, 6, 8], [1, 2, 5, 7, 9, 10], [1, 3]] 作为正确输出的时间。
  • 这是您问题中应该包含的信息。
  • @khelwood 谢谢。我现在已经编辑了我的问题。从下次开始,我会在发帖前记住这一点。

标签: java algorithm arraylist


【解决方案1】:

list.add(sub) 中,您将添加sub List 作为list List 的元素。

在您的第一个 sn-p 中,sub 始终引用同一个 List,这意味着您的输出 list 将包含对同一个 List 的多个引用。因此错误的答案。

在您的第二个 sn-p 中,您为每个递归调用创建 sub 的副本,这意味着您将向您的 list 添加不同的 List 实例。

【讨论】:

  • 我的理解要清楚,你的意思是在第一个代码中 sn-p 输出列表将引用相同的 ArrayList(sub)。正确的?但是我还有一个疑问,它将包含什么,例如最后生成的元素将出现在输出列表中的每个列表中。就像它包含 1,2,4 这个输出 [[1, 2, 4], [1, 2, 4], [1, 2, 4]]
  • @ParundeepSingh the lastly generated elements will be present in each of the list in output list - 输出列表中只有一个列表(或者,准确地说,相同的列表被多次添加到输出列表中)。因此,您会看到多次打印相同的元素。是的,sub 在代码执行结束时包含元素 1,2,4。
猜你喜欢
  • 2014-05-04
  • 2012-11-10
  • 2012-04-22
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多