Java8 ストリーム脳だけど Window がスマートに書けない苦しみ…
最終出力は手抜きになったけど大丈夫だ問題ない
public class ZundokoCheckerWithJava8Stream {
public static void main(String[] args) {
final Window<String> window = new Window<>(5);
Stream.generate(() -> Math.random() <= 0.5 ? "ズン" : "ドコ")
.map(window::next)
.peek(System.out::println)
.filter(z -> z.isPresent() && String.join(",", z.get()).equals("ズン,ズン,ズン,ズン,ドコ"))
.findFirst();
System.out.println("キ・ヨ・シ!");
}
public static class Window<T> {
final int size;
final List<T> elements;
public Window(int size) {
this.size = size;
elements = new ArrayList<>();
}
public Optional<List<T>> next(T element) {
while (wakuwoakeru())
;
elements.add(element);
return peek();
}
private boolean wakuwoakeru() {
if (elements.size() < size) {
return false;
}
elements.remove(0);
return true;
}
public Optional<List<T>> peek() {
if (elements.size() < size) {
return Optional.empty();
}
return Optional.of(elements);
}
}
}
出力例
Optional.empty
Optional.empty
Optional.empty
Optional.empty
Optional[[ドコ, ドコ, ドコ, ドコ, ズン]]
Optional[[ドコ, ドコ, ドコ, ズン, ズン]]
Optional[[ドコ, ドコ, ズン, ズン, ズン]]
Optional[[ドコ, ズン, ズン, ズン, ドコ]]
Optional[[ズン, ズン, ズン, ドコ, ズン]]
Optional[[ズン, ズン, ドコ, ズン, ズン]]
Optional[[ズン, ドコ, ズン, ズン, ズン]]
Optional[[ドコ, ズン, ズン, ズン, ズン]]
Optional[[ズン, ズン, ズン, ズン, ズン]]
Optional[[ズン, ズン, ズン, ズン, ドコ]]
キ・ヨ・シ!