2015-02-11 38 views
0

給定一個整數的數組(例如[8, 7, 5, 3]),我想驗證這些數是成對的共素數。Java:是否可以嵌套地圖方法(java.util.stream)?

我不知道是否可以用兩個嵌套的Arrays.streammap方法來做到這一點,如:Arrays.stream(r -> gcd(r, Map...)

你能幫我嗎?

+4

你能更詳細地解釋你想做什麼嗎?你是否希望對輸入數組中的每對整數執行一個方法?輸出是什麼? – Eran 2015-02-11 10:23:41

回答

4

問題歸結爲如何生成數組中的所有對。然後你可以使用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解釋,流的方法是不是一個替代對於一切,有時使用傳統的循環方法會更簡潔。

+0

非常感謝您的回答! (PS:看起來你的'isCoPrime'並不總是返回一個布爾值)。 – user3166747 2015-02-11 14:45:21

+1

@ user3166747對不起!我忘了更新代碼。 'isCoPrime'被遞歸調用。更新 :-) – 2015-02-11 15:22:58