从 2d Java 数组中切出一列或一行

Slice a column or row from 2d Java Array

我正在尝试对 Java 中的二维整数数组的列或行进行切片。

我尝试了以下语法 array[:][0] or array[0][:] 来获得第一个 column/row。我得到一个错误,所以很可能这不是 Java 中的正确语法。是否可以在任何情况下将 Java 中的特定 column/row 切片?

通常 java 中的二维数组看起来像这样:

double[][] doubleArray = new double[3][4];

所以获取第一行可以是:

double[] firstRow = doubleArray[0];

获取第一列可能如下所示:

double[] firstColumn = new double[doubleArray.length];
for (int i = 0; i < doubleArray.length; i++) {
  firstColumn[i] = doubleArray[i][0];
}

鉴于您索引数组[x][y],您可以通过以下方式获取列 x:

int column[] = array[x].

获取第 y 行:

int row[] = new int[array.length];

for (int i = 0; i < array.length; i++) {
    row[i] = array[i][y];
}

如果我没记错的话,在 Python 中切片对应于从给定数组中提取一个子数组,所以如果你有一个如下所示的数组:

int[][] vet = new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

执行以下切片 vet[0:3][1] 对应于检索具有元素 2, 5, 8 的数组(从第 0 行开始到第 3 行不包括的第二列)。

不幸的是,在 Java 中这是不可能的,至少不能“垂直”,因为二维数组基本上是数组的数组。每个“行”索引标识一个 sub-array 但实际上现在有实际的行或列,只是另一个数组中的数组。

您可以使用 Arrays.copyOfRange() 方法“水平”切片数组。

Integer[][] vet = new Integer[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
Integer[] subArray = new Integer[3];
subArray = Arrays.copyOfRange(vet[1], 0, 3); //Retrieves the elements [4, 5, 6]

相反,对于“垂直”切片,您需要编写一个实用方法:

public static void main(String[] args) {
    Integer[][] vet = new Integer[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    Integer[] subArray = new Integer[3];
    verticalSlicing(vet, subArray, 1, 0, 3);
    System.out.println(Arrays.toString(subArrayVert));  //Prints [2, 5, 8]
}

public static <T> void verticalSlicing(T[][] vet, T[] subArray, int col, int rowStart, int rowEnd) {
    if (col < 0 || col > subArray.length || (rowEnd - rowStart) > subArray.length) {
        return;
    }
    IntStream.range(rowStart, rowEnd).forEach(i -> subArray[i] = vet[i][col]);
}