繁体   English   中英

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

[英]Java best structure for 2D matrix of integers?

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

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

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

ArrayList<ArrayList<Integer>> ,然后在读完文件后立即将其转换为int[][]以获得性能。

正如您猜测的那样,在处理文件时最好使用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);

这是一个简单的示例类,用于创建和打印3x3 Matrix

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());
    }

}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM