如何在JAVA中以2D数组功能方式交换元素

问题描述 投票:0回答:1

我正在尝试将命令式转置函数重构为声明性的。这是命令性的实现:

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,但我不确定。

java declarative
1个回答
0
投票

您可以执行以下操作:

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中提取值。

© www.soinside.com 2019 - 2024. All rights reserved.