2012-06-18 75 views
3

在Java中存儲整數的二維矩陣的最佳方法是什麼?整數二維矩陣的Java最佳結構?

該矩陣將從數據文件中填充,該數據文件可能具有不同的維度,因此初始化int M [] [] = new int [n] [m]的某些大小不起作用,因爲我們不知道矩陣的大小,我們將迭代文件的行並從每行中提取整數(用空格分隔)。所以我想用一個ArrayList的ArrayList作爲對象在飛行中添加整數,但我不太確定如何做到這一點。

此外,重要的是選擇最佳結構來存儲矩陣的性能正弦我要迭代這個矩陣並做一些計算。

回答

11

ArrayList<ArrayList<Integer>>開始,然後只要您完成讀取文件,將其變爲int[][]以獲得性能。

+0

一個簡單的例子類,謝謝。接受答案。 –

4

正如你所猜測的,當你正在處理文件時,最好使用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); 
+0

你爲什麼不使用泛型? –

+0

我認爲它充分了解了整個想法...... – NominSim

-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]); 
} 
+0

說「ArrayList」沒有性能損失與原始數組相比是錯誤的。內部的ArrayList確實使用了原始數組,但是'ArrayList'會產生額外的開銷,這與原始數組不兼容。你肯定會在性能上產生差異,只是衡量這種下降是否值得。 – NominSim

2

下面是創建和打印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()); 
    } 

} 
我建議你沒有什麼