changeset 6147:073268a137d5

Bed height differences: Some refactoring of the calculation to improve readability and performance.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sat, 01 Jun 2013 18:59:52 +0200
parents 04dd1f598ef9
children b12ec9f240bc
files artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java
diffstat 1 files changed, 55 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java	Sat Jun 01 09:10:15 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java	Sat Jun 01 18:59:52 2013 +0200
@@ -114,71 +114,73 @@
 
     private BedDiffEpochResult calculateEpochDifference(BedHeight[] pair) {
 
-        TDoubleArrayList stations = pair[0].getStations();
-        TDoubleArrayList diffRes = new TDoubleArrayList();
-        TDoubleArrayList kms = new TDoubleArrayList();
-        TDoubleArrayList heights1 = new TDoubleArrayList();
-        TDoubleArrayList heights2 = new TDoubleArrayList();
+        BedHeight bh1 = pair[0];
+        BedHeight bh2 = pair[1];
 
-        for (int i = 0; i < stations.size(); i++) {
-            if (!Double.isNaN(pair[0].getHeight(stations.get(i))) &&
-                !Double.isNaN(pair[1].getHeight(stations.get(i)))) {
-                double hDiff =
-                    pair[0].getHeight(stations.get(i)) -
-                    pair[1].getHeight(stations.get(i));
+        TDoubleArrayList stations = bh1.getStations();
+        int size = stations.size();
+
+        TDoubleArrayList diffRes  = new TDoubleArrayList(size);
+        TDoubleArrayList kms      = new TDoubleArrayList(size);
+        TDoubleArrayList heights1 = new TDoubleArrayList(size);
+        TDoubleArrayList heights2 = new TDoubleArrayList(size);
+
+        for (int i = 0; i < size; i++) {
+            double station = stations.getQuick(i);
+            double h1      = bh1.getHeight(station);
+            double h2      = bh2.getHeight(station);
+            double hDiff   = h1 - h2;
+            if (!Double.isNaN(hDiff)) {
                 diffRes.add(hDiff);
-                kms.add(stations.get(i));
-                heights1.add(pair[0].getHeight(stations.get(i)));
-                heights2.add(pair[1].getHeight(stations.get(i)));
+                kms.add(station);
+                heights1.add(h1);
+                heights2.add(h2);
             }
         }
-        Date start = ((BedHeightEpoch)pair[0]).getStart();
-        Date end = ((BedHeightEpoch)pair[1]).getEnd();
+        Date start = ((BedHeightEpoch)bh1).getStart();
+        Date end   = ((BedHeightEpoch)bh2).getEnd();
         return new BedDiffEpochResult(kms, diffRes, heights1, heights2, start, end);
     }
 
     private BedDiffYearResult calculateYearDifference(BedHeight[] pair) {
 
-        TDoubleArrayList stations = pair[0].getStations();
-        TDoubleArrayList diffRes = new TDoubleArrayList();
-        TDoubleArrayList kms = new TDoubleArrayList();
-        TDoubleArrayList morphs = new TDoubleArrayList();
-        TDoubleArrayList absolute = new TDoubleArrayList();
-        TDoubleArrayList gap = new TDoubleArrayList();
-        TDoubleArrayList heights1 = new TDoubleArrayList();
-        TDoubleArrayList heights2 = new TDoubleArrayList();
-
         BedHeightSingle s1 = (BedHeightSingle)pair[0];
         BedHeightSingle s2 = (BedHeightSingle)pair[1];
-        int range = s1.getYear() - s2.getYear();
-        if (range  < 0) {
-            range = range * -1;
-        }
-        for (int i = 0; i < stations.size(); i++) {
-            if (!Double.isNaN(s1.getHeight(stations.get(i))) &&
-                !Double.isNaN(s2.getHeight(stations.get(i)))) {
-                double hDiff =
-                    s1.getHeight(stations.get(i)) -
-                    s2.getHeight(stations.get(i));
+
+        TDoubleArrayList stations = s1.getStations();
+        int size = stations.size();
+
+        TDoubleArrayList diffRes  = new TDoubleArrayList(size);
+        TDoubleArrayList kms      = new TDoubleArrayList(size);
+        TDoubleArrayList morphs   = new TDoubleArrayList(size);
+        TDoubleArrayList absolute = new TDoubleArrayList(size);
+        TDoubleArrayList gap      = new TDoubleArrayList(size);
+        TDoubleArrayList heights1 = new TDoubleArrayList(size);
+        TDoubleArrayList heights2 = new TDoubleArrayList(size);
+
+        int range = Math.abs(s1.getYear() - s2.getYear());
+
+        for (int i = 0; i < size; i++) {
+            double station = stations.getQuick(i);
+            double h1      = s1.getHeight(station);
+            double h2      = s2.getHeight(station);
+            double hDiff   = h1 - h2;
+
+            if (!Double.isNaN(hDiff)) {
                 diffRes.add(hDiff);
-                double km = stations.get(i);
-                kms.add(km);
-                if (s1.getMorphWidth(km) >
-                    s2.getMorphWidth(km)) {
-                    morphs.add(s1.getMorphWidth(km));
-                }
-                else {
-                    morphs.add(s2.getMorphWidth(km));
-                }
-                if (s1.getDataGap(km) > s2.getDataGap(km)) {
-                    gap.add(s1.getDataGap(km));
-                }
-                else {
-                    gap.add(s2.getDataGap(km));
-                }
-                absolute.add((hDiff / range) * 100);
-                heights1.add(s1.getHeight(km));
-                heights2.add(s2.getHeight(km));
+                kms.add(station);
+
+                morphs.add(Math.max(
+                    s1.getMorphWidth(station),
+                    s2.getMorphWidth(station)));
+
+                gap.add(Math.max(
+                    s1.getDataGap(station),
+                    s2.getDataGap(station)));
+
+                absolute.add((hDiff / range) * 100d);
+                heights1.add(h1);
+                heights2.add(h2);
             }
         }
         return new BedDiffYearResult(

http://dive4elements.wald.intevation.org