2014-11-21 96 views
1

我想知道在Java中實現矩陣的最佳方式,其中列和行必須輕鬆添加/刪除。Java動態矩陣結構

當涉及到列/行移除時,像double[][] matrix這樣的東西似乎相當沉重。

我做了一些搜索,但找不到處理此問題的設計模式(或如此)。你有什麼建議嗎?我不是在尋找一個圖書館,而是需要更多的指導方針。我正在考慮列表和地圖的混合,但我不確定這是最有效的。

這個link提供了一些幫助,但我確定有一個這樣的設計模式,或者至少有一個很好的方法來做到這一點。

這裏有一些更多的規格:我預計矩陣一般是300x300大。儘管我需要做很多操作(我正在做一個啓發式操作,可以更新數百次,每秒數百次),因此每次我想更新時都無法瀏覽它。沒有最大尺寸,但我預計它不會超過5000x5000。

+0

矩陣陣列有多大? 10x10或10000 X 10000?你多久更換一次行號/列號?是否有最大的marix尺寸? – Beri 2014-11-21 08:18:57

+0

我在我的問題中添加了一些更多規範,謝謝。 – Johy 2014-11-21 08:30:41

+0

當你添加/刪除列/行時,它總是在最後? – weston 2014-11-21 09:14:28

回答

3

一個可能的簡單的解決辦法是使用的目錄列表,像

int nRows = 8, nCols = 4; 
List<List<Double>> matrix = new ArrayList<>(nRows); 
for (int k = 0; k < nRows; k++) { 
    matrix.add(new ArrayList<>(nCols)); 
} 

在這種情況下將是非常容易的添加/刪除行,但有點棘手的添加/刪除列。

void removeRow(ArrayList<ArrayList<Double>> matrix, int rowIndexToRemove) { 
    matrix.remove(rowIndexToRemove); 
} 

void removeColumn(ArrayList<ArrayList<Double>> matrix, int coulmnIndexToRemove) { 
    for (ArrayList<Double> row : matrix) { 
     row.remove(coulmnIndexToRemove); 
    } 
} 

void addRow(ArrayList<ArrayList<Double>> matrix, int rowIndexWhereInsert, ArrayList<Double> newRow) { 
    matrix.add(rowIndexWhereInsert, newRow); 
} 

void addColumn(ArrayList<ArrayList<Double>> matrix, int columnIndexWhereInsert, ArrayList<Double> newColumn) { 
    for (int k = 0; k < matrix.size(); k++) { 
     ArrayList<Double> row = matrix.get(k); 
     row.add(columnIndexWhereInsert, newColumn.get(k)); 
    }   
} 
+1

感謝您的回答。我也想過這個,但它不適合這裏。也許我需要更加準確:我需要同時輕鬆訪問這兩者。每當我想更新它時,我都無法瀏覽矩陣。 – Johy 2014-11-21 08:25:52

1

我建議你創建自己的這個類,類似這樣的

class Matrix{ 
int rows 
int cols 
List<MatrixElement> elements; 
//some methods like getCols(), getRows() 
} 

class MatrixElement{ 
int row 
int col 
double value 
//some methods like boolean isNeighbourOf(MatrixElement other) etc whatever you need 

} 

這樣的事情是很容易實現,給你所有你需要的靈活性使用

1

有無時看看這個實現here。它看起來像你在找什麼。

+0

非常有趣的鏈接,謝謝。我可能會爲此而努力。儘管如此,我並沒有把我的問題標記爲答案,因爲我真的很想知道是否有任何好的做法。 正如我所提到的,我有興趣解決我的問題,但我對理論/抽象答案同樣感興趣:最小化需要矩陣容易更新。 – Johy 2014-11-21 08:56:39