2014-11-21 97 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