Last active
June 23, 2017 01:20
-
-
Save byplayer/b863a68fd888d165be4cb5a35e325f42 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class VersionHelper { | |
/** | |
* Compares one version string to another version string by dotted ordinals. | |
* eg. "1.0" > "0.09" ; "0.9.5" < "0.10", | |
* also "1.0" < "1.0.0" but "1.0" == "01.00" | |
* | |
* ref: https://stackoverflow.com/questions/6701948/efficient-way-to-compare-version-strings-in-java | |
* | |
* @param left the left hand version string | |
* @param right the right hand version string | |
* @return 0 if equal, -1 if thisVersion < comparedVersion and 1 otherwise. | |
*/ | |
public static int compare(@NotNull String left, @NotNull String right) { | |
if (left.equals(right)) { | |
return 0; | |
} | |
int leftStart = 0, rightStart = 0, result; | |
do { | |
int leftEnd = left.indexOf('.', leftStart); | |
int rightEnd = right.indexOf('.', rightStart); | |
Integer leftValue = Integer.parseInt(leftEnd < 0 | |
? left.substring(leftStart) | |
: left.substring(leftStart, leftEnd)); | |
Integer rightValue = Integer.parseInt(rightEnd < 0 | |
? right.substring(rightStart) | |
: right.substring(rightStart, rightEnd)); | |
result = leftValue.compareTo(rightValue); | |
leftStart = leftEnd + 1; | |
rightStart = rightEnd + 1; | |
} while (result == 0 && leftStart > 0 && rightStart > 0); | |
if (result == 0) { | |
if (leftStart > rightStart) { | |
return containsNonZeroValue(left, leftStart) ? 1 : 0; | |
} | |
if (leftStart < rightStart) { | |
return containsNonZeroValue(right, rightStart) ? -1 : 0; | |
} | |
} | |
return result; | |
} | |
private static boolean containsNonZeroValue(String str, int beginIndex) { | |
for (int i = beginIndex; i < str.length(); i++) { | |
char c = str.charAt(i); | |
if (c != '0' && c != '.') { | |
return true; | |
} | |
} | |
return false; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class VersionHelperTest { | |
@Test | |
public void testCompare() throws Exception { | |
assertEquals(1, VersionHelper.compare("1", "0.9")); | |
assertEquals(1, VersionHelper.compare("0.0.0.2", "0.0.0.1")); | |
assertEquals(1, VersionHelper.compare("1.0", "0.9")); | |
assertEquals(1, VersionHelper.compare("2.0.1", "2.0.0")); | |
assertEquals(1, VersionHelper.compare("2.0.1", "2.0")); | |
assertEquals(1, VersionHelper.compare("2.0.1", "2")); | |
assertEquals(1, VersionHelper.compare("0.9.1", "0.9.0")); | |
assertEquals(1, VersionHelper.compare("0.9.2", "0.9.1")); | |
assertEquals(1, VersionHelper.compare("0.9.11", "0.9.2")); | |
assertEquals(1, VersionHelper.compare("0.9.12", "0.9.11")); | |
assertEquals(1, VersionHelper.compare("0.10", "0.9")); | |
assertEquals(0, VersionHelper.compare("0.10", "0.10")); | |
assertEquals(-1, VersionHelper.compare("2.10", "2.10.1")); | |
assertEquals(-1, VersionHelper.compare("0.0.0.2", "0.1")); | |
assertEquals(1, VersionHelper.compare("1.0", "0.9.2")); | |
assertEquals(1, VersionHelper.compare("1.10", "1.6")); | |
assertEquals(0, VersionHelper.compare("1.10", "1.10.0.0.0.0")); | |
assertEquals(1, VersionHelper.compare("1.10.0.0.0.1", "1.10")); | |
assertEquals(0, VersionHelper.compare("1.10.0.0.0.0", "1.10")); | |
assertEquals(1, VersionHelper.compare("1.10.0.0.0.1", "1.10")); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment