繁体   English   中英

将二维数组的列拆分为单独的二维数组

[英]Splitting columns of 2D array into a separate 2D array

我想将二维数组的某些列作为二维数组发送到另一种方法。 例如,我有以下数组:

1 2 6 4
2 5 3 9
2 5 1 3

我想将中间的两列作为二维数组发送给一个方法:

2 6
5 3
5 1

我将如何以一种可以阐明要拆分的列的数量以及我希望拆分开始和结束的位置的方式进行拆分。 我的理解是System.arrayCopy()将是执行此操作的有效方法,但是,我只能用它复制一维数组。

试试这个。

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

int startColumn = 1;
int endColumn = 2;
int[][] result = Arrays.stream(arr)
        .map(row -> IntStream.rangeClosed(startColumn, endColumn)
                .map(j -> row[j]).toArray())
        .toArray(int[][]::new);

System.out.println(Arrays.deepToString(res));

Output: [[2, 6], [5, 3], [5, 1]]

它流式传输 2D 数组,对于每一行,它通过选择从startColumnendColumn的列构建一个 1D 数组,并将每个数组收集到 2D 数组中。

这有一个教训。

从二维数组中挑出几行更容易。 所以也许将列表示为行。

int[][] arr = {
        {1, 2, 2},
        {2, 5, 5},
        {6, 3, 1},
        {4, 9, 3}
};

int[][] sub = new int[] {
        Arrays.copyOf(arr[1], 3),
        Arrays.copyOf(arr[2], 3)
};

int[][] sharing = Arrays.copyOfRange(arr, 1, 3); // 3 exclusive.

最后一次sharingarr共享行(列)。

一个人可以制作一个矩阵 class。

这背后有一个故事。 亚洲算盘相对于罗马算盘旋转 90°。 这使得它更具可读性恕我直言,作为阅读数字,而soroban确实仍然是一个很好的教学和有用的工具。

实用程序: Arrays.copyOfRange(T[],int,int)

要从现有二维数组中获取二维子数组 - 您可以遍历此数组的行,并且对于每一行,使用Arrays.stream(int[],int,int)方法遍历指定范围

int[][] arr1 = {
        {1, 2, 6, 4},
        {2, 5, 3, 9},
        {2, 5, 1, 3}};
int[][] arr2 = Arrays.stream(arr1)
        // range from '1' inclusive to '3' exclusive
        .map(row -> Arrays.stream(row, 1, 3).toArray())
        .toArray(int[][]::new);
// output
Arrays.stream(arr2).map(Arrays::toString).forEach(System.out::println);
[2, 6]
[5, 3]
[5, 1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM