gpt4 book ai didi

java - 如何比较二维数组

转载 作者:行者123 更新时间:2023-11-30 02:26:46 24 4
gpt4 key购买 nike

我有这个二维数组:

int[][] matrix = new int[][]  {
{ 4, 4, 4, 4, 4},
{ 4, 3, 4, 3, 4},
{ 4, 3, 4, 3, 4},
{ 4, 3, 4, 3, 3},
{ 1, 1, 1, 3, 3},
{ 4, 4, 4, 3, 3},
{ 4, 5, 4, 3, 3},
{ 4, 4, 4, 3, 3}};

首先,我想将第一个元素与第二个元素进行比较,然后将第二个元素与第三个元素进行比较,依此类推,逐行进行比较。

然后我想逐列执行相同的操作,将元素 [0,0] 与元素 [1,0] 进行比较,然后将 [1,0] 与 [2,0] 进行比较,依此类推对于每一列,打开。

使用 for() 循环可以轻松完成此操作:

for (int r=0; r<A.length;r++) {
for (int c=0; c<A[r].length;c++){
if (if (matrix[r][c]==matrix[r][c+1])){
// do somet
}
}
}

但我需要的是使用 Java 8 函数式编程以及 lambda 和流迭代来执行相同的操作。

最佳答案

您的问题有点不清楚,无法提供普遍适用的代码。但可能足以让你走上正确的道路。

假设您只想查找相邻的重复项:

    //reference code
for (int[] row : matrix) {
for (int c = 0; c < row.length - 1; c++) {
if (row[c] == row[c + 1]) {
System.out.print(row[c]+" ");
}
}
}
//prints 4 4 4 4 3 1 1 3 4 4 3 3 4 4 3

我们还假设您的矩阵永远不会包含 -1。那么你可以这样做

    //simple accumulator with a side effect of print out
IntBinaryOperator accumulator = (acc, x) -> {
if (acc == x) System.out.print(x + " ");
return x;
};

//also prints 4 4 4 4 3 1 1 3 4 4 3 3 4 4 3
Arrays.stream(matrix).forEach(arr -> Arrays.stream(arr).reduce(-1, accumulator));

reduce(-1, Accumulator) 可以在任何 int 数组上查找彼此相邻的相同数字。累加器功能将前一个数字保留在 acc 中,并与传入的数字进行比较。当然,身份为 -1 是作弊,规范的方法是使用 Arrays.stream(arr).boxed()... 并使用 null 作为身份(它仍然会作弊,但将允许矩阵中的所有整数)。

这是另一个版本:

//prints 4 4 4 4 4 4 4 3 1 1 3 4 4 3 3 4 4 3 
Arrays.stream(matrix).flatMapToInt(Arrays::stream).reduce(-1, accumulator);

这次没有 forEach(),但由于它压平了矩阵,因此它将比较一行的最后一个元素与下一行的第一个元素 - 可能是一个错误或一个功能。

最后,具有打印内容副作用的累加器在函数式编程中并不好用。理想情况下,您应该 collect() 重复项列表并将其返回 - 由于您的问题如此模糊,我相信您可以使用上面的信息自己编写它。

你可以用矩阵、流和重复项来做一些其他有趣的事情,例如这将比两个嵌入式循环需要更多的编码:

 Map<Integer,Long> m = Arrays.stream(matrix)
.parallel()
.flatMapToInt(Arrays::stream)
.boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(m); //prints occurences of each int: {1=3, 3=15, 4=21, 5=1}

最后,流并不是 Elixir ,只是时不时提供一个不错的帮助。有些语言具有更好的语法和更强大的结构来适应函数式风格,但 Java 却因其他原因而受到青睐。

关于java - 如何比较二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45465966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com