changeset 8063:41d9014bfa02

Sediment density: Got rid of stupid extra year tracking.
author Sascha L. Teichmann <teichmann@intevation.de>
date Wed, 30 Jul 2014 18:34:48 +0200
parents 8489565ff563
children 50102c41151e
files artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java
diffstat 1 files changed, 36 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java	Wed Jul 30 16:50:26 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java	Wed Jul 30 18:34:48 2014 +0200
@@ -9,17 +9,16 @@
 package org.dive4elements.river.artifacts.model.minfo;
 
 import java.io.Serializable;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 
 import org.apache.log4j.Logger;
-
 import org.dive4elements.artifacts.common.utils.Config;
 
 
@@ -37,8 +36,7 @@
     public static final double SEDIMNET_DENSITY_FACTOR =
         getSedimentDensityFactor();
 
-    private Map<Integer, List<SedimentDensityValue>> densities;
-    private List<Integer> years;
+    private TreeMap<Integer, List<SedimentDensityValue>> densities;
 
 
     /** Figures out the sediment density factor from global config. */
@@ -64,18 +62,13 @@
     }
 
     public SedimentDensity() {
-        this.densities = new HashMap<Integer, List<SedimentDensityValue>>();
-        this.years = new ArrayList<Integer>();
+        densities = new TreeMap<Integer, List<SedimentDensityValue>>();
     }
 
     public Map<Integer, List<SedimentDensityValue>> getDensities() {
         return densities;
     }
 
-    public void setDensities(Map<Integer, List<SedimentDensityValue>> densities) {
-        this.densities = densities;
-    }
-
     public void addDensity(double km, double density, int year) {
 
         logger.debug("adding " + year);
@@ -90,22 +83,6 @@
         }
 
         list.add(new SedimentDensityValue(km, density, year));
-
-        // XXX: Why do we store a redundant list of years, too?
-        // Years are the keys of densities so they can be easily
-        // accessed by their key set!
-        if (!years.contains(key)) {
-            logger.debug("new year");
-            years.add(key);
-        }
-    }
-
-    public List<Integer> getYears() {
-        return years;
-    }
-
-    public void setYears(List<Integer> years) {
-        this.years = years;
     }
 
     /**
@@ -114,21 +91,32 @@
      * If no measurement was found 1.8 is returned.
      */
     public double getDensity(double km, int year) {
-        Collections.sort(this.years);
-        if (this.years.size() == 1 && years.get(0) <= year) {
-            logger.debug("get density from year " + year + " at km " + km);
-            return getDensityAtKm(densities.get(years.get(0)), km);
+
+        if (densities.isEmpty()) {
+            return SEDIMNET_DENSITY_FACTOR;
         }
-        if (this.years.size() > 1) {
-            for (int i = 0, I = years.size()-1; i < I; i++) {
-                int y1 = years.get(i);
-                int y2 = years.get(i + 1);
-                if (year >= y1 && year < y2) {
-                    return getDensityAtKm(densities.get(y1), km);
-                }
-                else if (year >= y2 && i == years.size() -1) {
-                    return getDensityAtKm(densities.get(y2), km);
-                }
+
+        if (densities.size() == 1) {
+            Map.Entry<Integer, List<SedimentDensityValue>> entry = densities.firstEntry();
+            return entry.getKey() <= year
+                ? getDensityAtKm(entry.getValue(), km)
+                : SEDIMNET_DENSITY_FACTOR;
+        }
+        Iterator<Map.Entry<Integer, List<SedimentDensityValue>>> iter =
+            densities.entrySet().iterator();
+
+        Map.Entry<Integer, List<SedimentDensityValue>> last = iter.next();
+
+        while (iter.hasNext()) {
+            Map.Entry<Integer, List<SedimentDensityValue>> current = iter.next();
+            last = current;
+            int y1 = last.getKey();
+            int y2 = current.getKey();
+            if (year >= y1 && year < y2) {
+                return getDensityAtKm(last.getValue(), km);
+            }
+            if (year >= y2 && !iter.hasNext()) {
+                return getDensityAtKm(current.getValue(), km);
             }
         }
         return SEDIMNET_DENSITY_FACTOR;
@@ -138,8 +126,9 @@
     public double[][] getAllDensities()
     {
         TreeMap<Double, Double> map = new TreeMap<Double,Double>();
-        for (int year: years) {
-            for (SedimentDensityValue sdv: densities.get(year)) {
+        // XXX: This looks stupid.
+        for (List<SedimentDensityValue> sdvs: densities.values()) {
+            for (SedimentDensityValue sdv: sdvs) {
                 map.put(sdv.getKm(), sdv.getDensity());
             }
         }
@@ -158,10 +147,14 @@
     public double[][] getDensities(int year)
     {
         TreeMap<Double, Double> map = new TreeMap<Double,Double>();
+        List<SedimentDensityValue> list = densities.get(year);
+        if (list == null) {
+            return new double[2][0];
+        }
         for (SedimentDensityValue sdv: densities.get(year)) {
             map.put(sdv.getKm(), sdv.getDensity());
         }
-        double[][] points = new double[2][map.keySet().size()];
+        double[][] points = new double[2][map.size()];
         int i = 0;
         for (Map.Entry<Double, Double> kmDens: map.entrySet()) {
             points[0][i] = kmDens.getKey();

http://dive4elements.wald.intevation.org