Compare two version numbers version1 and version1.
If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.
If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.
You may assume that the version strings are non-empty and contain only digits and the
The
For instance,
. character.The
. character does not represent a decimal point and is used to separate number sequences.For instance,
2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.
Here is an example of version numbers ordering:
0.1 < 1.1 < 1.2.1 < 13.37This is a very simple question. The only problem with me is that I am not familiar with java.util.StringTokenizer.
import java.util.StringTokenizer;
public class CompareVersionNumber {
public int compareVersion(String version1, String version2) {
if (version1 == null || version2 == null)
return 0;
StringTokenizer st1 = new StringTokenizer(version1, ".");
StringTokenizer st2 = new StringTokenizer(version2, ".");
while (st1.hasMoreTokens() && st2.hasMoreTokens())
{
//must declare a new string, otherwise when comparing for the values,
//it will through NoSuchElementException() if there exists only one token
String s1 = st1.nextToken();
String s2 = st2.nextToken();
if (Integer.valueOf(s1) < Integer.valueOf(s2))
return -1;
else if (Integer.valueOf(s1) > Integer.valueOf(s2))
return 1;
}
if (st1.hasMoreTokens() && !st1.nextToken().equals("0"))
return 1;
if (st2.hasMoreTokens() && !st2.nextToken().equals("0"))
return -1;
return 0;
}
}
Update: 2015 - 01 - 10
This time I use String.split, since "." is a special character, we need to add "\\." to escape that.
public int compareVersion(String version1, String version2) {
if (version1 == null || version2 == null)
throw new NullPointerException("Null Array!");
if (version1.equals(version2))
return 0;
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
int l = v1.length >= v2.length ? v2.length : v1.length;
for (int i = 0; i < l; i++) {
if(Integer.parseInt(v1[i]) > Integer.parseInt(v2[i]))
return 1;
else if (Integer.parseInt(v1[i]) < Integer.parseInt(v2[i]))
return -1;
}
if (l < v2.length) {
for (int i = l; i < v2.length; i++) {
if (Integer.parseInt(v2[i]) != 0)
return -1;
}
}
if (l < v1.length) {
for (int i = l; i < v1.length; i++) {
if (Integer.parseInt(v1[i]) != 0)
return 1;
}
}
return 0;
}
No comments:
Post a Comment