diff options
| -rw-r--r-- | main/res/values-de/strings.xml | 2 | ||||
| -rw-r--r-- | main/res/values/strings.xml | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/FilterUserInterface.java | 1 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/filter/PopularityRatioFilter.java | 73 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java | 5 |
5 files changed, 81 insertions, 4 deletions
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml index ec8a852..8d97abf 100644 --- a/main/res/values-de/strings.xml +++ b/main/res/values-de/strings.xml @@ -290,6 +290,7 @@ <string name="caches_filter_origin">Herkunft</string> <string name="caches_filter_distance">Entfernung</string> <string name="caches_filter_popularity">Beliebtheit</string> + <string name="caches_filter_popularity_ratio">Beliebtheit [%]</string> <string name="caches_removing_from_history">Lösche aus Verlauf…</string> <string name="caches_clear_offlinelogs">Offline-Logs löschen</string> <string name="caches_clear_offlinelogs_progress">Lösche Offline-Logs</string> @@ -1070,4 +1071,5 @@ <item quantity="one">%s Favorit</item> <item quantity="other">%s Favoriten</item> </plurals> + <string name="percent_favorite_points">% Favoriten</string> </resources> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index 79ba638..fab214b 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -331,6 +331,7 @@ <string name="caches_filter_distance">Distance</string> <string name="caches_filter_personal_note">With personal note</string> <string name="caches_filter_popularity">Popularity</string> + <string name="caches_filter_popularity_ratio">Popularity [%]</string> <string name="caches_removing_from_history">Removing from History…</string> <string name="caches_clear_offlinelogs">Clear offline logs</string> <string name="caches_clear_offlinelogs_progress">Clearing offline logs</string> @@ -1197,5 +1198,6 @@ <item quantity="one">%s favorite</item> <item quantity="other">%s favorites</item> </plurals> - + + <string name="percent_favorite_points">%\ favorites</string> </resources> diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java index 7813e69..d77341b 100644 --- a/main/src/cgeo/geocaching/filter/FilterUserInterface.java +++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java @@ -58,6 +58,7 @@ public final class FilterUserInterface { register(R.string.caches_filter_distance, DistanceFilter.Factory.class); register(R.string.caches_filter_personal_note, PersonalNoteFilter.class); register(R.string.caches_filter_popularity, PopularityFilter.Factory.class); + register(R.string.caches_filter_popularity_ratio, PopularityRatioFilter.Factory.class); // sort by localized names Collections.sort(registry, new Comparator<FactoryEntry>() { diff --git a/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java b/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java new file mode 100644 index 0000000..2d7207a --- /dev/null +++ b/main/src/cgeo/geocaching/filter/PopularityRatioFilter.java @@ -0,0 +1,73 @@ +package cgeo.geocaching.filter; + +import cgeo.geocaching.CgeoApplication; +import cgeo.geocaching.DataStore; +import cgeo.geocaching.Geocache; +import cgeo.geocaching.R; +import cgeo.geocaching.enumerations.LogType; + +import java.util.ArrayList; +import java.util.List; + +/** + * filters caches by popularity ratio (favorites per find in %). + */ +class PopularityRatioFilter extends AbstractFilter { + private final int minRatio; + private final int maxRatio; + + public PopularityRatioFilter(String name, final int minRatio, final int maxRatio) { + super(name); + this.minRatio = minRatio; + this.maxRatio = maxRatio; + } + + @Override + public boolean accepts(final Geocache cache) { + + int finds; + int favorites; + float ratio; + + finds = getFindsCount(cache); + + // prevent division by zero + if (finds == 0) { + return false; + } + + favorites = cache.getFavoritePoints(); + ratio = ((float) favorites / (float) finds) * 100.0f; + + return (ratio > minRatio) && (ratio <= maxRatio); + } + + private static int getFindsCount(Geocache cache) { + if (cache.getLogCounts().isEmpty()) { + cache.setLogCounts(DataStore.loadLogCounts(cache.getGeocode())); + } + Integer logged = cache.getLogCounts().get(LogType.FOUND_IT); + if (logged != null) { + return logged; + } + return 0; + } + + public static class Factory implements IFilterFactory { + + private static final int[] RATIOS = { 10, 20, 30, 40, 50, 75 }; + + @Override + public List<IFilter> getFilters() { + final List<IFilter> filters = new ArrayList<IFilter>(RATIOS.length); + for (int i = 0; i < RATIOS.length; i++) { + final int minRange = RATIOS[i]; + final int maxRange = Integer.MAX_VALUE; + final String name = "> " + minRange + " " + CgeoApplication.getInstance().getResources().getString(R.string.percent_favorite_points); + filters.add(new PopularityRatioFilter(name, minRange, maxRange)); + } + return filters; + } + + } +} diff --git a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java index fab7bb1..b5edf17 100644 --- a/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java +++ b/main/src/cgeo/geocaching/sorting/PopularityRatioComparator.java @@ -9,7 +9,6 @@ import cgeo.geocaching.enumerations.LogType; /** * sorts caches by popularity ratio (favorites per find in %). - * only caches with 10 finds and more are counted to obtain meaningful statistics */ public class PopularityRatioComparator extends AbstractCacheComparator { @@ -27,10 +26,10 @@ public class PopularityRatioComparator extends AbstractCacheComparator { int finds1 = getFindsCount(cache1); int finds2 = getFindsCount(cache2); - if (finds1 != 0 && finds1 > 9) { + if (finds1 != 0) { ratio1 = (((float) cache1.getFavoritePoints()) / ((float) finds1)); } - if (finds2 != 0 && finds2 > 9) { + if (finds2 != 0) { ratio2 = (((float) cache2.getFavoritePoints()) / ((float) finds2)); } |
