gpt4 book ai didi

java - 为什么我需要另一个新的 ArrayList,而不是将现有的 ArrayList 传递到 ArrayList 中?

转载 作者:行者123 更新时间:2023-12-01 12:02:30 25 4
gpt4 key购买 nike

我的问题是:

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 内的引用指向它的新副本。它们是两个不同的对象。

为什么这很重要?

基本上,您的递归步骤将一个元素添加到 r ,调用find再次,然后从 r 中删除一个元素。引用rres被传递到递归中,因此这意味着这两个相同的对象被传递到递归中。

但是由于从递归返回后,您主动从 r 中删除了一个对象,意味着最后,一直往上走, ​​r 里面就不会再有元素了.

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

把它想象成一个保险箱。 A 将保险箱装满了钱。然后他给了 B 第二把保险箱 key 。然后他用原来的 key 进去,拿出了所有的钱。当B过来打开保险箱时,里面是空的!

复制该列表相当于 A 将自己的钱交给 B 放在自己的保险箱中。 A可以从自己的保险箱中取出任意数量的钱,并且不会改变B保险箱中的钱数。

关于java - 为什么我需要另一个新的 ArrayList,而不是将现有的 ArrayList 传递到 ArrayList 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com