Мне интересно, как лучше реализовать матрицу на Java, в которой столбцы и строки должны быть легко добавлены/удалены.
Что-то вроде double[][] matrix
кажется довольно тяжелой, когда дело касается удаления столбцов/строк.
Я сделал некоторые поиски, но не смог найти шаблон дизайна (или около того), связанный с этим. Есть ли у вас предложения? Я не ищу библиотеку, но несколько рекомендаций о том, что нужно. Я думал о сочетании списков и карт, но я не уверен, что они наиболее эффективны.
Эта ссылка немного помогает, но я уверен, что для этого есть шаблон дизайна или, по крайней мере, хороший способ сделать это.
Вот еще несколько спецификаций: я ожидаю, что матрица будет в целом 300x300. Мне нужно сделать много манипуляций, хотя (я делаю эвристику, которая меняет ее много, сотни раз/сек), поэтому я не могу просматривать ее каждый раз, когда я хочу ее обновить. Нет максимального размера, но я не ожидаю, что он будет больше 5000х5000.
Возможным простым решением могло бы стать использование List of List, например
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));
}
}
Я предлагаю вам создать для этого свой собственный класс, подобный этому
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
}
Такая вещь довольно проста в применении и дает вам всю гибкость, которая вам нужна при использовании
Взгляните на эту реализацию здесь. Похоже на то, что вы ищете.