有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:是否可以有“嵌套”映射方法(Java.util.stream)?

给定一个int数组(例如[8, 7, 5, 3]),我想验证这些数字是否是成对的共素数

我想知道是否有可能用两个嵌套的Arrays.streammap方法来实现它,比如:Arrays.stream(r -> gcd(r, Map...)

你能帮我吗


共 (1) 个答案

  1. # 1 楼答案

    您的问题归结为如何生成数组中的所有对。然后您可以使用allMatch来检查成对共素数属性

    这将是一种可能的实施方式:

    private static boolean isCoPrime(int a, int b) {
        if (b == 0) return a == 1;
        return isCoPrime(b, a % b);
    }
    
    private static boolean isPairwiseCoPrime(int[] arr) {
        return IntStream.of(arr)
                        .allMatch(a -> IntStream.of(arr).filter(b -> b != a).allMatch(b -> isCoPrime(a, b)));
    }
    

    这将生成所有可能的对,并检查它们是否为同素数。然而,在检查时,这会导致不必要的计算,例如,如果对(8,7)是共素数,然后对(7,8)。所以另一个解决方法是:

    private static boolean isPairwiseCoPrime(int[] arr) {
        return IntStream.range(0, arr.length - 1)
                        .allMatch(i -> IntStream.range(i + 1, arr.length).allMatch(j -> isCoPrime(arr[i], arr[j])));
    }
    

    这基本上是Java 8之前的翻译:

    private static boolean isPairwiseCoPrime(int[] arr) {
        for(int i = 0; i < arr.length-1; i++) {
            for(int j = i + 1; j < arr.length; j++) {
                 if(!isCoPrime(arr[i], arr[j])) {
                     return false;
                 }
            }
        }
        return true;
    }
    

    正如我在this answer中所解释的,流方法并不是所有东西的替代品,有时使用传统的循环方法更简洁、更短