From 2de859398b5891b798535616ac435ecfe6b7471e Mon Sep 17 00:00:00 2001 From: seven332 Date: Wed, 26 Dec 2018 11:08:08 +0800 Subject: [PATCH] Fix big number causing NumberFormatException in NaturalComparator --- .../com/hippo/util/NaturalComparator.java | 46 +++++++++++++++++-- .../com/hippo/util/NaturalComparatorTest.java | 13 ++++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/hippo/util/NaturalComparator.java b/app/src/main/java/com/hippo/util/NaturalComparator.java index 6e126f5a5..faad7c353 100644 --- a/app/src/main/java/com/hippo/util/NaturalComparator.java +++ b/app/src/main/java/com/hippo/util/NaturalComparator.java @@ -56,10 +56,7 @@ public class NaturalComparator implements Comparator { int result; if (isDigit(data1) && isDigit(data2)) { - result = Long.compare(Long.valueOf(data1), Long.valueOf(data2)); - if (result == 0) { - result = -Integer.compare(data1.length(), data2.length()); - } + result = compareNumberString(data1, data2); } else { result = data1.compareToIgnoreCase(data2); } @@ -111,4 +108,45 @@ public class NaturalComparator implements Comparator { } return index; } + + private static String removeLeadingZero(String s) { + if (s.length() < 1) { + return s; + } + + // At least keep the last number + for (int i = 0, n = s.length() - 1; i < n; i++) { + if (s.charAt(i) != '0') { + return s.substring(i); + } + } + + return s.substring(s.length() - 1); + } + + private static int compareNumberString(String s1, String s2) { + String p1 = removeLeadingZero(s1); + String p2 = removeLeadingZero(s2); + + int l1 = p1.length(); + int l2 = p2.length(); + + if (l1 > l2) { + return 1; + } else if (l1 < l2) { + return -1; + } else { + for (int i = 0; i < l1; i++) { + char c1 = p1.charAt(i); + char c2 = p2.charAt(i); + if (c1 > c2) { + return 1; + } else if (c1 < c2) { + return -1; + } + } + } + + return -Integer.compare(s1.length(), s2.length()); + } } diff --git a/app/src/test/java/com/hippo/util/NaturalComparatorTest.java b/app/src/test/java/com/hippo/util/NaturalComparatorTest.java index 4137ec2e8..6d11f38e9 100644 --- a/app/src/test/java/com/hippo/util/NaturalComparatorTest.java +++ b/app/src/test/java/com/hippo/util/NaturalComparatorTest.java @@ -54,6 +54,19 @@ public class NaturalComparatorTest { assertOrder(null, "1"); } + @Test + public void testBigNumber() { + assertOrder("1", "22222222222222222222222222222222222222222222222222222222222222222222222"); + } + + @Test + public void testLeadingZero() { + assertOrder("000000000000000001", "1"); + assertOrder("000000000000000001", "0001"); + assertOrder("00000000000000000", "0"); + assertOrder("00000000000000000", "000"); + } + private void assertOrder(String s1, String s2) { NaturalComparator comparator = new NaturalComparator(); assertTrue(comparator.compare(s1, s2) < 0);