ArrayList 数组生成问题

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

给定一个包含 N 个整数的数组 A。 返回一个由数组所有子数组组成的二维数组

我曾尝试按照循环获取 temp 中的子数组,并将该子数组直接添加到 ans(2d arraylist)

    public ArrayList<ArrayList<Integer>> solve(ArrayList<Integer> A) {
        int n=A.size();
        ArrayList<ArrayList<Integer>> ans= new ArrayList<>();
        for(int i=0;i<n;i++)
        {
            ArrayList<Integer> temp=new ArrayList<>();
            for(int j=i;j<n;j++)
            {
                temp.add(A.get(j));                           
                ans.add(temp);                       
            }
        }
        return ans;
    }```


INPUT= [1,2,3,4,5]
Getting Output= [1 2 3 4 5 ] [1 2 3 4 5 ] [1 2 3 4 5 ] [1 2 3 4 5 ] [1 2 3 4 5 ] [2 3 4 5 ] [2 3 4 5 ] [2 3 4 5 ] [2 3 4 5 ] [3 4 5 ] [3 4 5 ] [3 4 5 ] [4 5 ] [4 5 ] [5 ]

Expected Output= [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5],[2],[2,3],[2,3,4],[2,3,4,5],[3],[3,4],[3,4,5],[4],[4,5],[5]]
java arrays multidimensional-array arraylist sub-array
1个回答
0
投票

问题是您将相同的

ArrayList
对象 (
temp
) 多次添加到
ans
。在 Java 中,
ArrayList
对象是可变的。因此,当您修改
temp
时,
ans
中对它的所有引用也会更新。

要修复此问题,请先从

temp
创建一个新列表,然后再将其添加到
ans
,例如,使用
new ArrayList<>(temp)
:

import java.util.ArrayList;
import java.util.Arrays;

class Main {
  public static void main(String[] args) {
    ArrayList<Integer> input = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
    System.out.println(solve(input));
  }

  public static ArrayList<ArrayList<Integer>> solve(ArrayList<Integer> A) {
    int n = A.size();
    ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
    for (int i = 0; i < n; i++) {
      ArrayList<Integer> temp = new ArrayList<>();
      for (int j = i; j < n; j++) {
        temp.add(A.get(j));
        ans.add(new ArrayList<>(temp));
      }
    }
    return ans;
  }
}

输出:

[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [2], [2, 3], [2, 3, 4], [2, 3, 4, 5], [3], [3, 4], [3, 4, 5], [4], [4, 5], [5]]
© www.soinside.com 2019 - 2024. All rights reserved.