当前位置: 首页 > 面试题库 >

为什么我需要另一个新的ArrayList而不是将现有的传递给ArrayList?

奚正谊
2023-03-14
问题内容

我的问题是:

ArrayList<String> temp = new ArrayList<String>(r);

没有这一行,我什么也没插入res

为什么不复制r到新的临时文件夹ArrayList,我什么也不会复制res

public class Solution {

    public ArrayList<ArrayList<String>> partition(String s) {
        ArrayList<ArrayList<String>> res = new ArrayList<ArrayList<String>>();
        ArrayList<String> r = new ArrayList<String>();
        find(s, 0, r, res);
        return res;
    }

    private void find(String s, int st, ArrayList<String> r, ArrayList<ArrayList<String>> res) {
        if (st >= s.length()){
            // This seems important.  Without the next line, I am inserting
            // nothing into "res".  Why?
            ArrayList<String> temp = new ArrayList<String>(r);
            res.add(temp);
            return;
        } else {
            for (int i=st; i<s.length();i++) {
                if (isValid(s, st, i)) {
                    r.add(s.substring(st,i+1));
                    find(s, i + 1, r, res);
                    r.remove(r.size()-1);
                }
            }
        }
    }

    private boolean isValid(String s, int st, int end) {
        while (st < end) {
            if (s.charAt(st) != s.charAt(end)) {
                return false;
            }
            st++;
            end--;
        }
        return true;
    }
}

问题答案:

正如另一个答案所说,这样做:

res.add(r)

r在列表中添加对同一对象的引用。实际上,这里发生的是:

  • r 指清单
  • 该引用作为参数传递给 add
  • 对列表的引用存储在内部 res

但是请注意,两者r和内部的引用res都指向 同一个对象

当您执行此操作时,temp会发生以下情况:

  • 创建一个新列表,并用引用原始列表中所有数据的副本r
  • 此列表已分配给 temp
  • 对新列表的引用作为参数传递给 add
  • 对列表的引用存储在内部 res

因此,现在r指向列表的原始副本,而内部引用res指向列表的新副本。它们是两个不同的对象。

为什么这很重要?

基本上,您的递归步骤向中添加一个元素rfind再次调用,然后从中删除一个元素rrres中的引用沿递归传递,这意味着这两个相同的对象沿递归传递。

但是由于从递归中返回后,您主动从中删除了一个对象r,这意味着最后,当您完全向上移动时,内部将不再有元素r

由于存储在内部的引用res指向的 是同一对象
r,而不是其副本,因此,当您使用删除项目时r.remove(),该对象将变为空。但这是我们从内部引用的对象res。因此,在递归结束时,它将为空。

认为它是安全的。A人用金钱装满保险柜。然后,他将B人的第二把钥匙交给保险箱。然后,他用原来的钥匙进入,取出了所有的钱。当B来打开保险柜时,它是空的!

复制此列表等效于A给予B自己的钱以放入自己的保险箱。A可以从自己的保险箱中取出任意多的钱,而且不会改变B保险箱中的钱数。



 类似资料:
  • 问题内容: 我有一个包含十个文件的文件夹,我想循环浏览。当我打印出文件名时,我的代码可以正常工作: 哪些打印: 但是,如果我尝试在循环中打开文件,则会出现IO错误: 我是否需要甚至在循环内将文件的完整路径传递给它们? 问题答案: 是的,您需要完整的路径。 是快速修复。正如注释所指出的那样,它会下降到子目录中,因此您确实需要使用当前目录的根目录,而不是用作路径联接的基础。

  • 问题内容: 我正在尝试编写一个与并发应用功能的应用程序。我希望这个函数是一个实例方法(因此我可以在不同的子类中不同地定义它)。这似乎是不可能的。正如我在其他地方了解到的那样,显然不能Pickling绑定方法。那么,为什么以绑定方法作为目标开始?如下代码: 产生以下输出: 为什么进程可以处理绑定方法,但不能处理池? 问题答案: 该模块通常不能腌制实例方法: 但是,该模块具有一个自定义,该自定义添加了

  • 问题内容: 简而言之,我有一个带有ArrayList参数的方法。在该方法中,出于仅与该方法返回的内容相关的目的,我修改了ArrayList的内容。因此,我根本不希望作为参数传递的ArrayList受到影响(即,不作为引用传递)。 我尝试过的一切都未能达到预期的效果。我需要怎么做才能只使用方法内ArrayList的副本,而不能更改实际变量? 问题答案: 即使您有办法将数组列表作为副本而不是通过引用传

  • 问题内容: 为什么经常被称为 代替 ? W3,MDN和MSDN都声明它是可选的。此外,ActiveX控件似乎不需要参数: 这种做法至少可以追溯到2005年的Google Maps中 ,但被缩小了,没有任何解释: 问题答案: 如果您看一下XMLHttpRequest的旧规范,似乎W3C似乎并不需要在某一点上将该参数设为可选,这可能导致人们提供了一个明确的null值,以防万一。 (搜索“应支持发送”)

  • 问题内容: 我的Python程序中有一个保存函数,如下所示: 在此,n为“ 1”。 我收到如下错误: 在外壳中执行相同的加载后,我没有收到任何错误: 为什么会有问题? 问题答案: 您可能从os模块导入了星号: 因此您使用了错误的打开功能。(我想您可以简单地完成,但是可能性较小。)通常,应避免这种导入样式,在实际情况下应避免使用。

  • 问题内容: 我有两节课。和。 我有一个要在中使用的功能。我当时正在考虑将的引用传递给的构造函数,然后再调用该函数。 那行得通吗?有人可以给我举个例子吗? 提前致谢! 问题答案: 是的,它将起作用。这是一种不错的方法。您只需传递A类的 实例 : 然后您可以拥有: