最近在开发《Maven Jar包新版本检测工具》的时候,需要一个算法来比较各种版本号的大小。简单的比如1.2.3
这种纯数字的,复杂的则包含了特殊字符和字母,比如1.2.3-Beta1
之类的。网上找了一下,大多都只支持纯数字的版本号判断。所以我把这些算法简单改造了一下,能够支持数字+字母+特殊字符的判断了。
PS:因为字母版本号命名基本没有规范,所以也就没有一个特定的规则去判断大小了。如果你要判断的版本号带有字母,请在本文代码的基础上再定制。
代码思路就是,先把各种特殊字符、字母替换一下,然后根据.
来切分版本号字符串为数字数组。然后判断分段判断数字的大小,从而计算出版本号的大小。
Java版本号比较算法,代码如下:
public static int compareVersion(String version1, String version2) {
version1 = version1.replace("_", ".").replace("-", ".").replaceAll("[^\\d.]+", "0");
version2 = version2.replace("_", ".").replace("-", ".").replaceAll("[^\\d.]+", "0");
version1 = version1.toLowerCase(Locale.ROOT);
version2 = version2.toLowerCase(Locale.ROOT);
String[] s1 = version1.split("\\.");
String[] s2 = version2.split("\\.");
int len1 = s1.length;
int len2 = s2.length;
int i, j;
for (i = 0, j = 0; i < len1 && j < len2; i++, j++) {
int big = 1;
int small = -1;
if (i == 0 && j == 0) {
//大版本不一致
big = 2;
small = -2;
}
if (Long.parseLong(s1[i]) > Long.parseLong(s2[j])) {
return big;
} else if (Long.parseLong(s1[i]) < Long.parseLong(s2[j])) {
return small;
}
}
while (i < len1) {
if (Long.parseLong(s1[i]) != 0) {
return 1;
}
i++;
}
while (j < len2) {
if (Long.parseLong(s2[j]) != 0) {
return -1;
}
j++;
}
return 0;
}
版本比较函数的入参是需要比较的两个版本号字符串,返回结果是-2
、-1
、0
、1
、2
。
- 如果version1大于version2,则返回正数;
- 如果version1等于version2,则返回0;
- 如果version1小于version2,则返回负数;
如果version1、version2相差的是大版本(大版本是指第一个.
之前的数字),则返回的结果是2
或者-2
。