Структура динамической матрицы Java

1

Мне интересно, как лучше реализовать матрицу на Java, в которой столбцы и строки должны быть легко добавлены/удалены.

Что-то вроде double[][] matrix кажется довольно тяжелой, когда дело касается удаления столбцов/строк.

Я сделал некоторые поиски, но не смог найти шаблон дизайна (или около того), связанный с этим. Есть ли у вас предложения? Я не ищу библиотеку, но несколько рекомендаций о том, что нужно. Я думал о сочетании списков и карт, но я не уверен, что они наиболее эффективны.

Эта ссылка немного помогает, но я уверен, что для этого есть шаблон дизайна или, по крайней мере, хороший способ сделать это.

Вот еще несколько спецификаций: я ожидаю, что матрица будет в целом 300x300. Мне нужно сделать много манипуляций, хотя (я делаю эвристику, которая меняет ее много, сотни раз/сек), поэтому я не могу просматривать ее каждый раз, когда я хочу ее обновить. Нет максимального размера, но я не ожидаю, что он будет больше 5000х5000.

  • 0
    Насколько большими будут ваши матричные массивы? 10х10 или 10000 х 10000? Как часто вы будете менять номер строки / столбца? Есть ли максимальный размер матрицы?
  • 0
    Я добавил еще несколько спецификаций в мои вопросы, спасибо.
Показать ещё 2 комментария
Теги:
data-structures
matrix

3 ответа

3
Лучший ответ

Возможным простым решением могло бы стать использование 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));
    }        
}
  • 1
    Спасибо за Ваш ответ. Я тоже об этом думал, но здесь это не подходит. может быть, мне нужно быть более точным: мне нужен одинаковый легкий доступ для обоих. Я не могу позволить просматривать матрицу каждый раз, когда хочу обновить ее.
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

Взгляните на эту реализацию здесь. Похоже на то, что вы ищете.

  • 0
    Очень интересная ссылка, спасибо. Я могу пойти на это. Я пока не помечаю свой вопрос как ответивший, так как мне действительно интересно узнать, есть ли хорошая практика. Как я уже упоминал, меня интересует решение моей проблемы, но я также заинтересован в теоретическом / абстрактном ответе: минимуме, необходимом для легкого обновления матрицы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню