8

Javaで整数の2D行列を格納する最良の方法は何ですか?

この行列はデータ ファイルから入力され、次元が異なる可能性があるため、行列のサイズがわからないため、あるサイズの 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次のように 2 次元行列に追加できます。

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 に答える
0

他の人が言ったように、最良のオプションは a を使用してファイルを読み取ることですが、読み取りが完了した後List<List<Integer>>に an に戻す必要はないと思います。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]);
}
于 2012-06-18T14:40:49.867 に答える