我正在尝试将命令式转置函数重构为声明性函数。下面是命令式实现:
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,但我不确定。
发布于 2019-10-26 22:38:35
你可以这样做:
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中提取值。
https://stackoverflow.com/questions/58571477
复制相似问题