从 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]);
}
我正在尝试对 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]);
}