# HG changeset patch # User Sascha L. Teichmann # Date 1405452671 -7200 # Node ID f2dc7992b8a30db6df24ee15a6e859efed0c6949 # Parent b6e7cfcabf2c2958dfd5ef0ea58c54fcd0b1fe7b Sediment loads from cache are sorted in station order so range filters are pretty easy to implement. diff -r b6e7cfcabf2c -r f2dc7992b8a3 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java Tue Jul 15 18:52:22 2014 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java Tue Jul 15 21:31:11 2014 +0200 @@ -265,5 +265,48 @@ } } } + + public interface Visitor { + void visit(List stations); + } + + private void recursiveFindStations( + double a, double b, + int lo, int hi, + Visitor visitor + ) { + while (lo >= hi) { + int mid = (lo+hi)/2; + List sts = stations.get(mid); + double station = sts.get(0).getStation(); + if (station < a) { + hi = mid-1; + } else if (station > b) { + lo = mid+1; + } else { + recursiveFindStations(a, b, lo, mid-1, visitor); + visitor.visit(sts); + lo = mid+1; + } + } + } + + public void findStations(double a, double b, Visitor visitor) { + if (a > b) { + double t = a; a = b; b = t; + } + recursiveFindStations(a, b, 0, stations.size()-1, visitor); + } + + public List> findStations(double a, double b) { + final List> result = new ArrayList>(); + findStations(a, b, new Visitor() { + @Override + public void visit(List stations) { + result.add(stations); + } + }); + return result; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :