java - 如何在JAVA中以功能方式交换二维数组上的元素

标签 java declarative

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

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/

相关文章:

java.lang.ClassNotFoundException sun.jdbc.odbc.JdbcOdbcDriver 在 sql server 2008 与 java 8

python - SQLAlchemy:如何使混合属性成为声明属性?

c# - "Turning"一个 IEnumerable<IEnumerable<T>> 90 度

javascript - 在 Javascript 中声明式编码的幕后仍然是必要的吗?

java - Interface Annotation 不接受 application.properties 值

java - 帮助 java 正则表达式

java - 使用 "Assert in selenium"验证 Facebook 登录

java - 如何在运行时以智能方式在多个 OSGi 服务中进行选择?

prolog - 以声明方式解决汉诺塔(Prolog)

java - 在 for 循环内确定 StringBuilder 的作用域