计算IntStream模式

时间:2020-08-21 11:35:57

标签: java

问题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

3 个答案:

答案 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

相关问题