changeset 8044:86fa217c24d5

Sediment load: Merge measurement stations if they have the same km. The chaining was too complicated to build algorithms on top of it.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 17 Jul 2014 07:45:14 +0200
parents 9342d7fe0ee7
children 549f18bf0008
files artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java
diffstat 1 files changed, 49 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java	Wed Jul 16 18:33:28 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java	Thu Jul 17 07:45:14 2014 +0200
@@ -11,6 +11,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 import java.util.TreeMap;
@@ -118,8 +119,8 @@
 
     public static class Station implements Serializable {
 
-        public static final int BED_LOAD  = 0;
-        public static final int SUSPENDED = 1;
+        public static final int BED_LOAD  = 1;
+        public static final int SUSPENDED = 2;
 
         private double station;
 
@@ -130,8 +131,6 @@
         private Station next;
         private Station prev;
 
-        private Station chain;
-
         public Station() {
             this(BED_LOAD, 0.0);
         }
@@ -153,6 +152,10 @@
             return type;
         }
 
+        public boolean isType(int type) {
+            return (this.type & type) == type;
+        }
+
         public void setNext(Station next) {
             this.next = next;
         }
@@ -177,13 +180,46 @@
             return isKMUp ? getPrev() : getNext();
         }
 
-        public Station nextChain() {
-            return chain;
+        public void merge(Station other) {
+            this.type |= other.type;
+            for (int i = 0, N = grainFractions.size(); i < N; ++i) {
+                grainFractions.set(i,
+                    mergeValues(grainFractions.get(i), other.grainFractions.get(i)));
+            }
         }
 
-        public void append(Station station) {
-            station.chain = chain;
-            chain = station;
+        private static final Comparator<Value> ID_CMP = new Comparator<Value>() {
+            @Override
+            public int compare(Value a, Value b) {
+                return a.getLoad().getId() - b.getLoad().getId();
+            }
+        };
+
+        private static List<Value> mergeValues(List<Value> a, List<Value> b) {
+            if (a == null) return b;
+            if (b == null) return a;
+            a.addAll(b);
+            // re-establish id order.
+            Collections.sort(a, ID_CMP);
+            return a;
+        }
+
+        public Station nextByType(int type, boolean isKMUp) {
+            for (Station curr = this; curr != null; curr = curr.getNext(isKMUp)) {
+                if (curr.isType(type)) {
+                    return curr;
+                }
+            }
+            return null;
+        }
+
+        public Station prevByType(int type, boolean isKMUp) {
+            for (Station curr = this; curr != null; curr = curr.getPrev(isKMUp)) {
+                if (curr.isType(type)) {
+                    return curr;
+                }
+            }
+            return null;
         }
 
         public void addValue(int grainFraction, Value value) {
@@ -248,15 +284,6 @@
 
             return Double.NaN;
         }
-
-        public Station firstOfType(int type) {
-            for (Station curr = this; curr != null; curr = curr.chain) {
-                if (curr.getType() == type) {
-                    return curr;
-                }
-            }
-            return null;
-        }
     } // class Station
 
 
@@ -279,7 +306,7 @@
             if (st == null) {
                 same.put(key, station);
             } else {
-                st.append(station);
+                st.merge(station);
             }
         }
         this.stations = new Station[same.size()];
@@ -291,18 +318,9 @@
     }
 
     private void wireNeighbors() {
-        for (int i = 0, N = stations.length; i < N-1; ++i) {
-            for (Station curr = stations[i]; curr != null; curr = curr.nextChain()) {
-                int type = curr.getType();
-                NEXT: for (int j = i+1; j < N; ++j) {
-                    Station next = stations[j].firstOfType(type);
-                    if (next != null) {
-                        curr.setNext(next);
-                        next.setPrev(curr);
-                        break NEXT;
-                    }
-                }
-            }
+        for (int i = 1; i < stations.length; ++i) {
+            stations[i-1].setNext(stations[i]);
+            stations[i].setPrev(stations[i-1]);
         }
     }
 

http://dive4elements.wald.intevation.org