0

我正在编写一种对向量(一维数组)执行某些操作的方法。我想将它应用于矩阵的行和列(二维数组:行数组,每一行都是一个数组)。我想知道这样做的最佳方法。

向量方法可能需要额外的参数。例如,它可以实现一个排序算法(我的没有,但它已经足够复杂了)。

现在,如果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. 设计该方法,使其可以与向量或矩阵列一起使用,但是由于每次访问元素时允许两种情况,该方法的工作将变得复杂。

  4. 也许参数可以是一个函数f(无论如何实现),所以该方法使用f(n)?然后对于一个向量vectorf给定的是f(n)返回(对的引用)vector[n]。对于一行矩阵matrixf(n)返回matrix[row][n],对于一列f(n)返回matrix[n][column]

4

1 回答 1

1

定义一个抽象(假设您的矩阵包含整数):

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;
    }
}
于 2018-11-24T08:45:30.533 回答