ArrayLists的Java 2D数组

时间:2013-06-07 20:38:54

标签: java arrays arraylist

我有一个大小为nXm的2D矩阵,每个单元格包含一个未知数量的Integer类型的值(因此我必须使用List才能动态添加内容,并且必须使用2D数组nXm,因为数组很容易访问和编写代码)。 PL

  • 在推荐我任何其他数据结构之前轻松回答下面我的问题,然后讨论为什么我不应该这样做,并选择你认为会更好,更有效的方法:

如何为下面的变量分配内存?

 ArrayList<Integer>[][] i2DArrayList;

我知道在某些方面我必须这样做。但是在此之前我必须做一些我不记得的其他内存分配。你可以指导我这件事。

for (int i = 0; i < n; i++) {   
            for (int j = 0; j < m; j++) {
                i2DArrayList[i][j] = new ArrayList<Integer>();    
    }
}

我已经知道如何在1D中执行此操作:

ArrayList<Integer>[] i1DArrayList;

i1DArrayList = new ArrayList[n]; 
    for (int i = 0; i < i1DArrayList.length; i++) {
        i1DArrayList[i] = new ArrayList<Integer>();
    }

1 个答案:

答案 0 :(得分:1)

只需使用多维数组初始值设定项:

ArrayList<Integer>[][] i2DArrayList = new ArrayList<Integer>[n][m];

相当于:

ArrayList<Integer>[][] i2DArrayList = new ArrayList<Integer>[n][];
for (int i = 0; i < n; i++) {   
    i2DArrayList[i] = new ArrayList<Integer>[m];
}

<击>

Java不允许分配通用数组。也就是说,您无法制作new T[]new List<T>[]。原因是数组还存储其元素类型以允许在运行时检查元素类型。但是,类型擦除会在编译时删除这些泛型类型,因此无法为new T[]new List<T>[]分配有效的元素类型。但是有一些解决方案:

  • 使用一些Collection类型来存储矩阵。例如:

    List<List<List<Integer>>> i2DArrayList = new ArrayList<List<List<Integer>>>();
    

    但是,这很快就会变得难看。

  • 您可以制作自己的非通用入门课程:

    class Entry {
        final List<Integer> entries = new ArrayList<Integer>();
    }
    
    Entry[][] i2DArrayList = new Entry[n][m];
    
  • 如果您知道矩阵稀疏,则可以使用Map<Position, List<Integer>>Position使用xy字段的值类。