diff options
Diffstat (limited to 'main')
| -rw-r--r-- | main/src/cgeo/geocaching/Geocache.java | 15 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/utils/MatcherWrapper.java | 4 |
2 files changed, 13 insertions, 6 deletions
diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index 77efd7e..f229af8 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -834,12 +834,15 @@ public class Geocache implements ICache, IWaypoint { @Override public String getNameForSorting() { if (null == nameForSorting) { - final MatcherWrapper matcher = new MatcherWrapper(NUMBER_PATTERN, name); - if (matcher.find()) { - nameForSorting = name.replace(matcher.group(), StringUtils.leftPad(matcher.group(), 6, '0')); - } - else { - nameForSorting = name; + nameForSorting = name; + // pad each number part to a fixed size of 6 digits, so that numerical sorting becomes equivalent to string sorting + MatcherWrapper matcher = new MatcherWrapper(NUMBER_PATTERN, nameForSorting); + int start = 0; + while (matcher.find(start)) { + final String number = matcher.group(); + nameForSorting = StringUtils.substring(nameForSorting, 0, matcher.start()) + StringUtils.leftPad(number, 6, '0') + StringUtils.substring(nameForSorting, matcher.start() + number.length()); + start = matcher.start() + Math.max(6, number.length()); + matcher = new MatcherWrapper(NUMBER_PATTERN, nameForSorting); } } return nameForSorting; diff --git a/main/src/cgeo/geocaching/utils/MatcherWrapper.java b/main/src/cgeo/geocaching/utils/MatcherWrapper.java index c3c1663..78b1170 100644 --- a/main/src/cgeo/geocaching/utils/MatcherWrapper.java +++ b/main/src/cgeo/geocaching/utils/MatcherWrapper.java @@ -22,6 +22,10 @@ public class MatcherWrapper { return matcher.find(); } + public boolean find(int start) { + return matcher.find(start); + } + /** * see {@link Matcher#group(int)} */ |
