问题1:串流(10分)
通过构造单个流管道,完成以下模式方法以生成输出,如示例jshell会话中所示。
假设答案已保存在文件pattern.jsh中,并以以下内容开头答案:String pattern(int n) { return ... } jshell> import java.util.stream.*; jshell> /open pattern.jsh jshell> System.out.println(pattern(3)); 321.21..1 jshell> System.out.println(pattern(5)); 54321.4321..321...21....1 jshell> /exit
我该如何尝试这个问题并按顺序打印出点?
这是我编写的代码:
IntStream.iterate(5, x -> x > 0, x -> x -1 )
.flatMap(x -> IntStream.rangeClosed(0,x).map(y -> x - y))
.mapToObj(x -> x == 0 ? "." : x + "")
.reduce("", (x, y) -> x + y);
And this is the result i got:
"54321.4321.321.21.1."
I just dont know how to increment the dot part. Will be grateful if someone can help me out on this. Thank you
答案 0 :(得分:1)
这是一种实现方法:对于范围在5到1之间的每个数字x,都会生成从5到1的y序列。如果y> x,则发出“。”,否则发出y。
String pattern = IntStream.iterate(5, x -> x > 0, x -> x - 1)
.boxed()
.flatMap(x -> IntStream.iterate(5, y -> y > 0, y -> y - 1)
.mapToObj(y -> y > x ? "." : y + ""))
.collect(Collectors.joining());
答案 1 :(得分:0)
IntStream.iterate(5, x -> x > 0, x -> x -1 ).boxed()
.flatMap(x -> IntStream.iterate(5 , y -> y > 0 , y -> y - 1)
.mapToObj(y -> y > x ? "." : y + ""))
.reduce("", (x,y) -> x + y);
在@Joni的帮助下,我设法使代码正常工作。
答案 2 :(得分:0)
如果您还需要算法解决方案。我们可以看到,字符串长度为n * n,如果模数大于除法结果,则需要点,否则,模数为+1。
Stream.iterate(n*n-1,x->x-1).limit(n*n)
.map(x -> x%n>x/n ? ".":String.valueOf(1+x%n))
.collect(Collectors.joining());
6个示例:
654321.54321..4321 ... 321 .... 21 ..... 1