# HG changeset patch # User Sascha L. Teichmann # Date 1405508769 -7200 # Node ID aa622bddfdacf50452ccdf80cb4ff9a8f015210f # Parent 1de6256c9786eeb70474e9c14d8d35bedc7ec8e9 Directly chain stations with the same km position together. This ease some summations. diff -r 1de6256c9786 -r aa622bddfdac 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 Wed Jul 16 11:55:46 2014 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java Wed Jul 16 13:06:09 2014 +0200 @@ -40,7 +40,7 @@ } public interface Visitor { - void visit(List stations); + void visit(Station station); } public static class Value implements Serializable { @@ -125,6 +125,8 @@ private Station next; private Station prev; + private Station chain; + public Station() { this(BED_LOAD, 0.0); } @@ -170,6 +172,15 @@ return isKMUp ? getPrev() : getNext(); } + public Station nextChain() { + return chain; + } + + public void append(Station station) { + station.chain = chain; + chain = station; + } + public void addValue(int grainFraction, Value value) { List values = grainFractions.get(grainFraction); if (values == null) { @@ -233,10 +244,10 @@ return Double.NaN; } - public static Station firstOfType(List stations, int type) { - for (Station station: stations) { - if (station.getType() == type) { - return station; + public Station firstOfType(int type) { + for (Station curr = this; curr != null; curr = curr.chain) { + if (curr.getType() == type) { + return curr; } } return null; @@ -244,7 +255,7 @@ } // class Station - private List> stations; + private List stations; public SedimentLoadData() { } @@ -254,32 +265,32 @@ } public void setStations(Collection stations) { - TreeMap> same = - new TreeMap>(EpsilonComparator.CMP); + TreeMap same = + new TreeMap(EpsilonComparator.CMP); + for (Station station: stations) { Double key = station.getStation(); - List sts = same.get(key); - if (sts == null) { - sts = new ArrayList(2); - same.put(key, sts); + Station st = same.get(key); + if (st == null) { + same.put(key, station); + } else { + st.append(station); } - sts.add(station); } - this.stations = new ArrayList>(same.values()); + this.stations = new ArrayList(same.values()); wireNeighbors(); } private void wireNeighbors() { for (int i = 0, N = stations.size(); i < N-1; ++i) { - for (Station current: stations.get(i)) { - int type = current.getType(); + for (Station curr = stations.get(i); curr != null; curr = curr.nextChain()) { + int type = curr.getType(); NEXT: for (int j = i+1; j < N; ++j) { - for (Station next: stations.get(j)) { - if (next.getType() == type) { - current.setNext(next); - next.setPrev(current); - break NEXT; - } + Station next = stations.get(j).firstOfType(type); + if (next != null) { + curr.setNext(next); + next.setPrev(curr); + break NEXT; } } } @@ -293,15 +304,15 @@ ) { while (lo >= hi) { int mid = (lo+hi)/2; - List sts = stations.get(mid); - double station = sts.get(0).getStation(); + Station st = stations.get(mid); + double station = st.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); + visitor.visit(st); lo = mid+1; } } @@ -314,12 +325,12 @@ recursiveFindStations(a, b, 0, stations.size()-1, visitor); } - public List> findStations(double a, double b) { - final List> result = new ArrayList>(); + 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); + public void visit(Station station) { + result.add(station); } }); return result;