Java中针对整数二维矩阵的最佳数据结构是什么?

8
什么是在Java中存储二维整数矩阵的最佳方法?
这个矩阵将从数据文件中填充,可能具有不同的尺寸,因此初始化int M [] [] = new int [n] [m]某些大小并不起作用,因为我们不知道矩阵的大小,我们只会迭代文件的行,并从每行中提取整数(内部由空格分隔)。所以我想使用一个ArrayList of ArrayList来添加整数作为对象,但我不太确定如何做。
此外,在性能方面选择最佳结构来存储这样的矩阵非常重要,因为我将迭代此矩阵并执行一些计算。
4个回答

14
开始时使用一个 ArrayList<ArrayList<Integer>>,在读完文件后立即将其转换为 int[][],以提高性能。

5
正如你所猜测的那样,在处理文件时,最好使用一个ArrayListArrayList。如果性能在事后成为问题,将其转换回二维数组可能是明智的选择。您可以像这样向二维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);

4

这是一个简单的示例类,创建并打印一个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());
    }

}

0

正如其他人所说,最好的选择是使用 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]);
}

说使用ArrayList与原始数组没有性能损失是错误的。内部 ArrayList 确实使用原始数组,但是 ArrayList 有额外的开销,而原始数组则没有。你肯定会遇到性能上的差异,只要衡量下降是否值得就行了。 - NominSim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接