8

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

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

就性能而言,选择存储此类矩阵的最佳结构也很重要,因为我将迭代此矩阵并进行一些计算。

4

4 回答 4

14

从 开始ArrayList<ArrayList<Integer>>,然后在您完成读取文件后,将其转换为int[][]用于性能的。

于 2012-06-18T14:07:11.753 回答
5

如您所料,在处理文件时最好使用ArrayListof 。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);
于 2012-06-18T14:09:32.253 回答
3

这是一个创建和打印 3x3 矩阵的简单示例类

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

public class TestMatrix {

    public static void main(String[] args){

        ArrayList<ArrayList<Integer>> matrix = new ArrayList<ArrayList<Integer>>();

        System.out.println(matrix.toString());//print empty matrix
        ArrayList<Integer> row1 = new ArrayList<Integer>(Arrays.asList(1,2,3));
        ArrayList<Integer> row2 = new ArrayList<Integer>(Arrays.asList(4,5,6));
        ArrayList<Integer> row3 = new ArrayList<Integer>(Arrays.asList(7,8,9));
        matrix.add(row1);
        matrix.add(row2);
        matrix.add(row3);
        System.out.println(matrix.toString());
    }

}
于 2015-10-08T16:25:11.580 回答
0

正如其他人所说,最好的选择是使用 a来读取文件,但我认为没有必要在完成阅读后将List<List<Integer>>其转换回 an 。int[][]内部ArrayList已经使用了数组(因此得名),编译器很可能会转换list.get(i).get(j)为 simple 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]);
}
于 2012-06-18T14:40:49.867 回答