首先版本号的数字长度不定,中间逗号数量不定。
网上没有找到可以借鉴的方法,无奈自己写一个
思路是- 将其无规则的版本号转换成数据,然后对数字进行比较。这里思路简单明了就是为了尽可能满足业务下的版本号的比较
String versionStartString = “1.1.1.65.221”;
String versionEndString = “1.652.221”;
String versionCurrentString = “1.234321.615.221”;
这里进行补0,转换为一下字符串
// 1 000001 000001 000065 000221
//1 000652 000221
//1 234321 000615 000221
再将上面字符串转化为数字,进行大小比较
1000001000001000065000221
1000652000221
1234321000615000221
bigdecimal支持的位数很长天然支持上面大小比较
下面为代码
public static void main(String[] args) {
BigDecimal bigDecimal = new BigDecimal("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
BigDecimal bigDecimal2 = new BigDecimal("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
// 先验证下bigdecimal支持的位数计算肯定满足业务
// 1234567901234567901234567901234567901234567901234567901234567901234567901234567901234555555555555555555555554320987654320987654320987654320987654320987654320987654320987654320987654320987654321
System.out.println(bigDecimal.multiply(bigDecimal2));
String versionStartString = "1.1.1.65.221";
String versionEndString = "1.652.221";
String versionCurrentString = "1.234321.615.221";
// 校验
Assert.state(isNumeric(versionStartString.replace(" ", "").replace(".", "")), "格式错误");
Assert.state(isNumeric(versionEndString.replace(" ", "").replace(".", "")), "格式错误");
Assert.state(isNumeric(versionCurrentString.replace(" ", "").replace(".", "")), "格式错误");
String[] split1 = versionStartString.replace(" ", "").split("\\.");
String[] split2 = versionEndString.replace(" ", "").split("\\.");
String[] split3 = versionCurrentString.replace(" ", "").split("\\.");
// 找到最长的数,按照他进行补零操作
String maxLength1 = Arrays.stream(split1).max((v1, v2) -> v1.length() - v2.length()).get();
String maxLength2 = Arrays.stream(split2).max((v1, v2) -> v1.length() - v2.length()).get();
String maxLength3 = Arrays.stream(split3).max((v1, v2) -> v1.length() - v2.length()).get();
int maxLength = Math.max(Math.max(maxLength1.length(), maxLength2.length()), maxLength3.length());
// 如果是6,就是1000000
BigDecimal times = new BigDecimal("1");
for (int i = 0; i < maxLength; i++) {
times = times.multiply(new BigDecimal("10"));
}
// 最大组数
int maxSplit = Math.max(Math.max(split1.length, split2.length), split3.length);
BigDecimal res1 = new BigDecimal("0");
BigDecimal res2 = new BigDecimal("0");
BigDecimal res3 = new BigDecimal("0");
for (int i = 1; i <= maxSplit; i++) { //1,2,3,4
BigDecimal tmp = new BigDecimal("1");
for (int j = 1; j < i; j++) { // 乘以i次
tmp = tmp.multiply(times);
}
if (maxSplit - i - (maxSplit - split1.length) >= 0) {
res1 = res1.add(tmp.multiply(new BigDecimal(split1[maxSplit - i - (maxSplit - split1.length)])));
}
if (maxSplit - i - (maxSplit - split2.length) >= 0) {
res2 = res2.add(tmp.multiply(new BigDecimal(split2[maxSplit - i - (maxSplit - split2.length)])));
}
if (maxSplit - i - (maxSplit - split3.length) >= 0) {
res3 = res3.add(tmp.multiply(new BigDecimal(split3[maxSplit - i - (maxSplit - split3.length)])));
}
}
boolean flag = true; // 默认满足条件
if (res1.compareTo(res3) > 0 || res3.compareTo(res2) > 0) {
flag = false; // 校验发现不满去条件
}
System.out.println(res1);
System.out.println(res2);
System.out.println(res3);
// 最大长度是6,每一组自动补齐6位
// 1 000001 000001 000065 000221
//1 000652 000221
//1 234321 000615 000221
/* 打印输出结果如下
1234567901234567901234567901234567901234567901234567901234567901234567901234567901234555555555555555555555554320987654320987654320987654320987654320987654320987654320987654320987654320987654321
1000001000001000065000221
1000652000221
1234321000615000221
*/
}
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
return true;
}