任意のfrom-toを表現するオブジェクトとして、
import lombok.Data; @Data public class Route{ private Integer from; private Integer to; }
こんなクラスがあったとする。これのリストのパターンとして、
想定している Route のリスト、連続性が成立している
From | To |
0 | 9 |
10 | 19 |
20 | 29 |
30 | null |
重なりがある(=20)
From | To |
0 | 9 |
10 | 20 |
20 | 29 |
30 | null |
抜けがある(=19)
From | To |
0 | 9 |
10 | 18 |
20 | 29 |
30 | null |
これら Route のリストの連続性、重なりの存在、抜けの存在をチェックする方法で
考えた方法が、Stream の reduce を使う方法、AtomicBoolean を使わなければスッキリするのだが。
もっと綺麗な方法が思いつかない。
List<Route> list; // ←ここに何かの処理で格納される。ソートされている前提で、
AtomicBoolean result = new AtomicBoolean(true); list.stream().reduce(new Route(), (a, b)->{ result.set(Boolean.logicalAnd(res.get(), a.getTo()==null ? true : (b.getFrom()-a.getTo())==1)); return b; }); // result.get()==true なら、連結に重なりも抜けはない。連続性が想定どおり // result.get()==false なら、連結に重なりか抜けがある。
最後の Route の to が null であるかをチェックしたければ、
AtomicBoolean result = new AtomicBoolean(true); Route lastroute = list.stream().reduce(new Route(), (a, b)->{ result.set(Boolean.logicalAnd(res.get(), a.getTo()==null ? true : (b.getFrom()-a.getTo())==1)); return b; }); // lastroute.getTo() が null かどうかをチェックする