Java整数二维矩阵的最佳结构?

时间:2012-06-18 14:03:26

标签: java arraylist integer

在Java中存储2D整数矩阵的最佳方法是什么?

此矩阵将从数据文件填充,该数据文件可能具有不同的维度,因此初始化int M [] [] = new int [n] [m]的某些大小不起作用,因为我们不知道大小矩阵,我们将迭代文件的行,并从每行提取整数(由内部空格分隔)。所以我想使用ArrayList的ArrayList来动态地将整数作为对象添加,但是我不太清楚如何做到这一点。

同样重要的是选择最佳结构来存储这种矩阵的性能,因为我将迭代这个矩阵并进行一些计算。

3 个答案:

答案 0 :(得分:11)

ArrayList<ArrayList<Integer>>开始,然后在您完成阅读文件后,将其转换为int[][]以提高效果。

答案 1 :(得分:4)

正如您所猜测的,在处理文件时最好使用ArrayList ArrayList。如果性能在事后成为一个问题,那么将其转换为二维数组后可能是谨慎的。

您可以像这样添加二维ArrayList矩阵:

ArrayList<ArrayList<Integer>> matrix = new ArrayList<ArrayList<Integer>>();
matrix.add(new ArrayList<Integer>());
matrix.get(0).add(ROW0Col0Number);
matrix.get(0).add(ROW0Col1Number);
matrix.get(1).add(ROW1Col0Number);

答案 2 :(得分:-1)

正如其他人所说,最好的选择是使用List<List<Integer>>来读取文件,但我不认为在完成阅读后将其转换回int[][]是必要的。内部ArrayList已经使用数组(因此名称),编译器可能会将list.get(i).get(j)简化为arr[i][j],因此不存在性能损失。如果您关注空间性能,可以使用trimToSize()在构建列表后修剪列表。

另一方面,最好先写A[i][j]然后A.get(i).get(j),这取决于你。我会写一些伪伪代码,因为我不知道你打算如何从文件中获取元素。

List<List<Integer>> mat = new ArrayList<List<Integer>>();
for line in file{
    row = new ArrayList<Integer>();
    mat.add(row);
    for element in line
        row.add(element);
    row.trimToSize();
}
mat.trimToSize()

//If you really want to convert, and is sure that all rows have the same size...
int[][] A = new int[mat.size()][];
int i=0;
for (List<Integer> row : mat){
    A[i++] = row.toArray(A[i]);
}