我试图使用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;
}
答案 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)));