给定一组int(例如[8, 7, 5, 3]
),我想验证这些数字是成对联合素数。
我想知道是否可以使用两种嵌套的Arrays.stream
和map
方法来执行此操作,例如:Arrays.stream(r -> gcd(r, Map...)
。
你能帮助我吗?
答案 0 :(得分:4)
您的问题减少了如何生成数组中的所有对。然后,您可以使用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中所解释的那样,Stream方法并不是所有内容的替代品,有时使用传统的循环方法更简洁,更短。