aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/sorting
diff options
context:
space:
mode:
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/FindsComparator.java8
-rw-r--r--main/src/cgeo/geocaching/sorting/InverseComparator.java22
3 files changed, 42 insertions, 6 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/FindsComparator.java b/main/src/cgeo/geocaching/sorting/FindsComparator.java
index 6407b11..47e3844 100644
--- a/main/src/cgeo/geocaching/sorting/FindsComparator.java
+++ b/main/src/cgeo/geocaching/sorting/FindsComparator.java
@@ -1,13 +1,11 @@
package cgeo.geocaching.sorting;
import cgeo.geocaching.cgCache;
-import cgeo.geocaching.cgeoapplication;
+import cgeo.geocaching.cgData;
import cgeo.geocaching.enumerations.LogType;
public class FindsComparator extends AbstractCacheComparator {
- private final cgeoapplication app = cgeoapplication.getInstance();
-
@Override
protected boolean canCompare(cgCache cache1, cgCache cache2) {
return cache1.getLogCounts() != null && cache2.getLogCounts() != null;
@@ -20,9 +18,9 @@ public class FindsComparator extends AbstractCacheComparator {
return finds2 - finds1;
}
- private int getFindsCount(cgCache cache) {
+ private static int getFindsCount(cgCache cache) {
if (cache.getLogCounts().isEmpty()) {
- cache.setLogCounts(app.loadLogCounts(cache.getGeocode()));
+ cache.setLogCounts(cgData.loadLogCounts(cache.getGeocode()));
}
Integer logged = cache.getLogCounts().get(LogType.FOUND_IT);
if (logged != null) {
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);
+ }
+
+}