2015-02-11 40 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