我正在尝试将命令式转置函数重构为声明式函数。这是命令式实现:
for (int i = 0; i < routes.length; i++) {
for (int j = i; j < routes.length; j++) {
Route temp = routes[j][i];
routes[j][i] = routes[i][j];
routes[i][j] = temp;
}
}
这是我绝望的尝试,但由于认知负荷而陷入困境:
Arrays.stream(routes).forEach(routes1 -> Arrays.stream(routes1).forEach(
route -> {
Route temp ??
}
));
我猜解决方案在于使用map而不是forEach,但我不确定。
最佳答案
你可以这样做:
int[][] routes = {{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
// convert columns to rows
Map<Integer, List<AbstractMap.SimpleEntry<Integer, Integer>>> rows = Arrays.stream(routes)
.flatMap(ints -> IntStream.range(0, ints.length).mapToObj(i -> new AbstractMap.SimpleEntry<>(i, ints[i])))
.collect(Collectors.groupingBy(AbstractMap.SimpleEntry::getKey));
// extract values from rows
Integer[][] result = rows.values().stream().map(simpleEntries -> simpleEntries.stream()
.map(AbstractMap.SimpleEntry::getValue).toArray(Integer[]::new))
.toArray(Integer[][]::new);
输出
1 4 7
2 5 8
3 6 9
您可以将转置矩阵视为将列转换为行,这是这里的基本思想。在第一个映射中,我们按列索引对值进行分组,这将是新行,第二部分只是从 Map
中提取值。
关于java - 如何在JAVA中以功能方式交换二维数组上的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58571477/