我正在尝试将命令式转置函数重构为声明性的。这是命令性的实现:
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 ??
}
));
我想解决方案在于使用地图代替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
中提取值。