aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/sorting
diff options
context:
space:
mode:
authorBananeweizen <bananeweizen@gmx.de>2012-12-12 20:14:23 +0100
committerBananeweizen <bananeweizen@gmx.de>2012-12-12 20:14:23 +0100
commit9a9000f770fd6a58b14cb970eabc6d4ab2f9d51b (patch)
tree863cba3b25c89c9b8f16125a2af78bb655534385 /main/src/cgeo/geocaching/sorting
parent8a4f62ab17c24efd90a1d9fac35af235b36ac221 (diff)
downloadcgeo-9a9000f770fd6a58b14cb970eabc6d4ab2f9d51b.zip
cgeo-9a9000f770fd6a58b14cb970eabc6d4ab2f9d51b.tar.gz
cgeo-9a9000f770fd6a58b14cb970eabc6d4ab2f9d51b.tar.bz2
fix #1747: sort in reverse order
Diffstat (limited to 'main/src/cgeo/geocaching/sorting')
-rw-r--r--main/src/cgeo/geocaching/sorting/DistanceComparator.java18
-rw-r--r--main/src/cgeo/geocaching/sorting/InverseComparator.java22
2 files changed, 39 insertions, 1 deletions
diff --git a/main/src/cgeo/geocaching/sorting/DistanceComparator.java b/main/src/cgeo/geocaching/sorting/DistanceComparator.java
index d601433..781359a 100644
--- a/main/src/cgeo/geocaching/sorting/DistanceComparator.java
+++ b/main/src/cgeo/geocaching/sorting/DistanceComparator.java
@@ -11,8 +11,22 @@ import java.util.List;
*/
public class DistanceComparator extends AbstractCacheComparator {
+ final private Geopoint coords;
+ final private List<cgCache> list;
+ private boolean cachedDistances;
+
public DistanceComparator(final Geopoint coords, List<cgCache> list) {
- // calculate all distances to avoid duplicate calculations during sorting
+ this.coords = coords;
+ this.list = list;
+ }
+
+ /**
+ * calculate all distances only once to avoid costly re-calculation of the same distance during sorting
+ */
+ private void calculateAllDistances() {
+ if (cachedDistances) {
+ return;
+ }
for (cgCache cache : list) {
if (cache.getCoords() != null) {
cache.setDistance(coords.distanceTo(cache.getCoords()));
@@ -21,6 +35,7 @@ public class DistanceComparator extends AbstractCacheComparator {
cache.setDistance(null);
}
}
+ cachedDistances = true;
}
@Override
@@ -30,6 +45,7 @@ public class DistanceComparator extends AbstractCacheComparator {
@Override
protected int compareCaches(final cgCache cache1, final cgCache cache2) {
+ calculateAllDistances();
if (cache1.getCoords() == null && cache2.getCoords() == null) {
return 0;
}
diff --git a/main/src/cgeo/geocaching/sorting/InverseComparator.java b/main/src/cgeo/geocaching/sorting/InverseComparator.java
new file mode 100644
index 0000000..d2fa085
--- /dev/null
+++ b/main/src/cgeo/geocaching/sorting/InverseComparator.java
@@ -0,0 +1,22 @@
+package cgeo.geocaching.sorting;
+
+import cgeo.geocaching.cgCache;
+
+/**
+ * comparator which inverses the sort order of the given other comparator
+ *
+ */
+public class InverseComparator implements CacheComparator {
+
+ private final CacheComparator originalComparator;
+
+ public InverseComparator(CacheComparator comparator) {
+ this.originalComparator = comparator;
+ }
+
+ @Override
+ public int compare(cgCache lhs, cgCache rhs) {
+ return originalComparator.compare(rhs, lhs);
+ }
+
+}