在 Java 中使用迭代查找子集的程序。问题:两个 ArrayList 碰巧共享相同的地址。帮助调试

问题描述 投票:0回答:1

下面是在 Java 中使用迭代查找子集的程序。

问题:当仅尝试更新

ans
时,
ansCopy
也会使用新值进行更新。也许,两个 ArrayList
ans
ansCopy
碰巧共享相同的地址。

需求:帮忙调试!!

public static ArrayList<ArrayList<Integer> > subsetUsingIteration2(int[] a) {
    ArrayList<ArrayList<Integer> > ans=new ArrayList<ArrayList<Integer> >();
    ans.add(new ArrayList<Integer>()); 
    // ArrayList<ArrayList<Integer> > ans={{}};
    ArrayList<ArrayList<Integer> > ansCopy=new ArrayList<ArrayList<Integer> >();
    // ArrayList<Integer> ansCopy={};
    for(int i=0; i<a.length; i++) {
      ansCopy.addAll(ans);      
      for(int j=0; j<ansCopy.size(); j++) 
        ansCopy.get(j).add(a[i]);
      ans.addAll(ansCopy);
      ansCopy.clear();      
    }
    return ans;
  }

尝试找到这两个变量的内存地址。但找不到他们。

java memory arraylist data-structures subset
1个回答
0
投票

在每个步骤中,您应该复制

ans
中的每个列表,从数组
a
附加一个新数字,然后再次将该新列表添加到
ans

你已经正确开始了。但是,最好使用 List 而不是数组列表作为引用类型。

List<List<Integer> > ans=new ArrayList<>();
ans.add(new ArrayList<>());

并且,在 for 循环中:

  1. 从已填充的

    ans
    复制每个元素。

  2. 从数组

    a
    添加新元素,这基本上是一个新的子集。

  3. inner
    表示的新子集添加到 ans

    for (int elem : a) {
        int n = ans.size();
        for (int i = 0; i < n; i++) {
            // copy each element from the `ans` which is already populated.
            List<Integer> inner = new ArrayList<>(ans.get(i));
            // Add the new elment from array `a` which is basically a new 
            // subset
            inner.add(elem);
            // Add the new subset represented by `inner` to the ans
            ans.add(inner);
        }
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.