changeset 8038:aa622bddfdac

Directly chain stations with the same km position together. This ease some summations.
author Sascha L. Teichmann <teichmann@intevation.de>
date Wed, 16 Jul 2014 13:06:09 +0200
parents 1de6256c9786
children 3a769d5fb733
files artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java
diffstat 1 files changed, 40 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- 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<Station> 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<Value> values = grainFractions.get(grainFraction);
             if (values == null) {
@@ -233,10 +244,10 @@
             return Double.NaN;
         }
 
-        public static Station firstOfType(List<Station> 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<List<Station>> stations;
+    private List<Station> stations;
 
     public SedimentLoadData() {
     }
@@ -254,32 +265,32 @@
     }
 
     public void setStations(Collection<Station> stations) {
-        TreeMap<Double, List<Station>> same =
-            new TreeMap<Double, List<Station>>(EpsilonComparator.CMP);
+        TreeMap<Double, Station> same =
+            new TreeMap<Double, Station>(EpsilonComparator.CMP);
+
         for (Station station: stations) {
             Double key = station.getStation();
-            List<Station> sts = same.get(key);
-            if (sts == null) {
-                sts = new ArrayList<Station>(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<List<Station>>(same.values());
+        this.stations = new ArrayList<Station>(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<Station> 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<List<Station>> findStations(double a, double b) {
-        final List<List<Station>> result = new ArrayList<List<Station>>();
+    public List<Station> findStations(double a, double b) {
+        final List<Station> result = new ArrayList<Station>();
         findStations(a, b, new Visitor() {
             @Override
-            public void visit(List<Station> stations) {
-                result.add(stations);
+            public void visit(Station station) {
+                result.add(station);
             }
         });
         return result;

http://dive4elements.wald.intevation.org