aboutsummaryrefslogtreecommitdiffstats
path: root/src/cgeo/geocaching/sorting/DistanceComparator.java
diff options
context:
space:
mode:
authorBananeweizen <bananeweizen@gmx.de>2011-07-23 21:52:13 +0200
committerBananeweizen <bananeweizen@gmx.de>2011-07-23 21:52:13 +0200
commit0454ba218fd2d9add5c663c9799b80b59a259eff (patch)
treeccabf3e3be73210fdfa4cb39633731e84122f16d /src/cgeo/geocaching/sorting/DistanceComparator.java
parent6d33eb1f7022544c145400845a4f084f1610ffa8 (diff)
downloadcgeo-0454ba218fd2d9add5c663c9799b80b59a259eff.zip
cgeo-0454ba218fd2d9add5c663c9799b80b59a259eff.tar.gz
cgeo-0454ba218fd2d9add5c663c9799b80b59a259eff.tar.bz2
move all comparators to a new package
extract interface and common implementation details of sorting
Diffstat (limited to 'src/cgeo/geocaching/sorting/DistanceComparator.java')
-rw-r--r--src/cgeo/geocaching/sorting/DistanceComparator.java65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/cgeo/geocaching/sorting/DistanceComparator.java b/src/cgeo/geocaching/sorting/DistanceComparator.java
new file mode 100644
index 0000000..fc7b712
--- /dev/null
+++ b/src/cgeo/geocaching/sorting/DistanceComparator.java
@@ -0,0 +1,65 @@
+package cgeo.geocaching.sorting;
+
+import cgeo.geocaching.cgBase;
+import cgeo.geocaching.cgCache;
+
+/**
+ * sorts caches by distance to current position
+ *
+ */
+public class DistanceComparator extends AbstractCacheComparator {
+ private Double latitude = null;
+ private Double longitude = null;
+
+ public DistanceComparator() {
+ // nothing
+ }
+
+ public DistanceComparator(Double latitudeIn, Double longitudeIn) {
+ setCoords(latitudeIn, longitudeIn);
+ }
+
+ public void setCoords(Double latitudeIn, Double longitudeIn) {
+ latitude = latitudeIn;
+ longitude = longitudeIn;
+ }
+
+ @Override
+ protected boolean canCompare(cgCache cache1, cgCache cache2) {
+ return true;
+ }
+
+ @Override
+ protected int compareCaches(final cgCache cache1, final cgCache cache2) {
+ if ((cache1.latitude == null || cache1.longitude == null
+ || cache2.latitude == null || cache2.longitude == null)
+ && cache1.distance != null && cache2.distance != null) {
+ if (cache1.distance < cache2.distance) {
+ return -1;
+ } else if (cache1.distance > cache2.distance) {
+ return 1;
+ } else {
+ return 0;
+ }
+ } else {
+ if (cache1.latitude == null || cache1.longitude == null) {
+ return 1;
+ }
+ if (cache2.latitude == null || cache2.longitude == null) {
+ return -1;
+ }
+
+ Double distance1 = cgBase.getDistance(latitude, longitude,
+ cache1.latitude, cache1.longitude);
+ Double distance2 = cgBase.getDistance(latitude, longitude,
+ cache2.latitude, cache2.longitude);
+
+ if (distance1 < distance2) {
+ return -1;
+ } else if (distance1 > distance2) {
+ return 1;
+ }
+ }
+ return 0;
+ }
+}