給定一個整數的數組(例如[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