在Java中存储2D整数矩阵的最佳方法是什么?
此矩阵将从数据文件填充,该数据文件可能具有不同的维度,因此初始化int M [] [] = new int [n] [m]的某些大小不起作用,因为我们不知道大小矩阵,我们将迭代文件的行,并从每行提取整数(由内部空格分隔)。所以我想使用ArrayList的ArrayList来动态地将整数作为对象添加,但是我不太清楚如何做到这一点。
同样重要的是选择最佳结构来存储这种矩阵的性能,因为我将迭代这个矩阵并进行一些计算。
答案 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]);
}