Java - применение векторного метода к строке или столбцу матрицы - PullRequest
0 голосов
/ 24 ноября 2018

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

Векторный метод может принимать дополнительные параметры.Например, он может реализовать алгоритм сортировки (у меня его нет, но он достаточно сложный).

Теперь, если matrix - матрица, и я хочу использовать метод в 4-й строке, япросто подключите matrix[3] к методу, поэтому, когда метод получит доступ к a[n], он получит доступ к matrix[3][n].Но не так просто применить его к столбцу, потому что всякий раз, когда метод обращается к a[n], я бы хотел, чтобы он обращался к matrix[n][7] (в случае 8-го столбца).

В прошлом я пыталсяприменять векторный метод для доступа к list[index[n]] (list и index - векторы) всякий раз, когда к методу обращался a[n].Тогда я использовал способ копирования (№ 1. ниже).

Пути, о которых я думал (ни один изящный):

  1. Создайте вектор, скопируйте содержимоестолбец в вектор, примените метод, затем скопируйте содержимое вектора обратно в столбец матрицы (и избавьтесь от вектора / повторно используйте его для применения в другом столбце позже).

  2. Дублируйте метод, один из которых работает с a[n], где a - векторный параметр, а другой - с a[n][m], где a является параметром матрицы, а m является параметром int.

  3. Разработайте метод так, чтобы он работал либо с вектором, либо со столбцом матрицы, но тогда работа метода будет усложнена, если учитывать 2 случая при каждом обращении к элементу.

  4. Может быть, параметр может быть функцией f (как бы реализованной), поэтому метод использует f(n)?Тогда для вектора vector, f задано так, что f(n) возвращает (ссылка на) vector[n].Для строки матрицы matrix, f(n) возвращает matrix[row][n], а для столбца f(n) возвращает matrix[n][column]

1 Ответ

0 голосов
/ 24 ноября 2018

Определите абстракцию (при условии, что ваша матрица содержит целые числа):

public interface IntVector {
    public int size();
    public int get(int index);
    public void set(int index, int value);
}

Измените свой алгоритм так, чтобы он использовал IntVector, а не массив.

Затем определите две реализации:

public class RowVector implements IntVector {

    private final int[] row;

    public RowVector(int[] row) {
        this.row = row;
    }

    @Override
    public int size() {
        return row.length;
    }

    @Override
    public int get(int index) {
        return row[index];
    }

    @Override
    public void set(int index, int value) {
        row[index] = value;
    }
}

и

public class ColumnVector implements IntVector {
    private final int[][] matrix;
    private final int column;

    public ColumnVector(int[][] matrix, int column) {
        this.matrix = matrix;
        this.column = column;
    }

    @Override
    public int size() {
        return matrix.length;
    }

    @Override
    public int get(int index) {
        return matrix[index][this.column];
    }

    @Override
    public void set(int index, int value) {
        matrix[index][this.column] = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...