Pythagorean Triplet使用Java8

时间:2016-03-10 10:06:20

标签: java functional-programming java-8

我试图使用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 个答案:

答案 0 :(得分: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());
}

诀窍在于每个IntStream上的flatMap并将其转换为Stream<Triplet>。不幸的是,由于flatMapToObj没有IntStream转换为Stream<T>,我们需要先调用boxed()将其转换为Stream<Integer>

示例代码(类toString()上有适当的Triplet):

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]]"
}

作为旁注,这是构建毕达哥拉斯三胞胎的非常缓慢的暴力实施:)。

答案 1 :(得分:0)

IntStream.rangeClosed(1,100).boxed()。flatMap(a - &gt;         IntStream.rangeClosed(a,100).filter(b - &gt; Math.sqrt(a a + b b)%1 == 0).mapToObj(b - &gt; new int [] { a,b,(int)Math.sqrt(a * a + b * b)}))。forEach(a-&gt; System.out.println(Arrays.toString(a)));