2016-03-10 51 views
3

我正在嘗試使用Java8查找給定數量下的所有畢達哥拉斯三元組。使用Java8的畢達哥拉斯三元組編號

我試着用下面顯示的代碼解決問題。但是,我仍然在突變三胞胎名單。

我想知道如何在不改變列表的情況下實現下面的代碼。

public static List<Triplet> returnPythogoreanTriplets(int num) { 
    List<Triplet> triplets = new ArrayList(); 
    IntStream.rangeClosed(1, num).forEach(hyp->{ 
     IntStream.range(1, hyp) 
      .forEach(side1->{ 
       IntStream.rangeClosed(1, side1) 
       .forEach(side2->{ 
        Triplet t = new Triplet<>(side2, side1, hyp); 
        if(t.isPythagorean()){ 
         triplets.add(t); 
         System.out.println(t); 
        } 
       }); 
      }); 
     }); 
    return triplets; 
} 

回答

2

下面將做

public static List<Triplet> returnPythogoreanTriplets(int num) { 
    return IntStream.rangeClosed(1, num).boxed().flatMap(hyp -> 
     IntStream.range(1, hyp).boxed().flatMap(side1 -> 
      IntStream.rangeClosed(1, side1).mapToObj(side2 -> new Triplet(side2, side1, hyp)) 
     ) 
    ) 
    .filter(Triplet::isPythagorean) 
    .collect(Collectors.toList()); 
} 

訣竅是flatMap每個IntStream,把它們變成一個Stream<Triplet>。不幸的是,由於沒有flatMapToObjIntStream轉換爲Stream<T>,因此我們需要調用boxed()將其變成Stream<Integer>

示例代碼(與類Triplet適當toString()):

public static void main(String[] args) { 
    System.out.println(returnPythogoreanTriplets(3)); 
    // prints "[Triplet [a=1, b=1, c=2], Triplet [a=1, b=1, c=3], Triplet [a=1, b=2, c=3], Triplet [a=2, b=2, c=3]]" 
} 

作爲一個側面說明,這是非常緩慢的強力實施,以打造勾股數:)。

相關問題