给定一个整数的数组(例如[8, 7, 5, 3]
),我想验证这些数是成对的共素数。Java:是否可以嵌套地图方法(java.util.stream)?
我不知道是否可以用两个嵌套的Arrays.stream
和map
方法来做到这一点,如:Arrays.stream(r -> gcd(r, Map...)
。
你能帮我吗?
给定一个整数的数组(例如[8, 7, 5, 3]
),我想验证这些数是成对的共素数。Java:是否可以嵌套地图方法(java.util.stream)?
我不知道是否可以用两个嵌套的Arrays.stream
和map
方法来做到这一点,如:Arrays.stream(r -> gcd(r, Map...)
。
你能帮我吗?
问题归结为如何生成数组中的所有对。然后你可以使用allMatch
来检查成对的co-prime属性。
这将是一个可能的实现:
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解释,流的方法是不是一个替代对于一切,有时使用传统的循环方法会更简洁。
非常感谢您的回答! (PS:看起来你的'isCoPrime'并不总是返回一个布尔值)。 – user3166747 2015-02-11 14:45:21
@ user3166747对不起!我忘了更新代码。 'isCoPrime'被递归调用。更新 :-) – 2015-02-11 15:22:58
你能更详细地解释你想做什么吗?你是否希望对输入数组中的每对整数执行一个方法?输出是什么? – Eran 2015-02-11 10:23:41