提供一种版本号排序的方法
前情概要
在项目中可能有管理版本号的需求,当展示版本号时我们不希望它时乱序的,如何对乱序的版本号进行排序呢?当然你可以提前对入库的版本号添加排序或者是根据创建日期进行排序,我这里提供的方法是基于List集合排序的一种方法。
思路
List有一个sort方法,它可以自定义排序规则,自定义比较规则将版本号首先去除非数字和英文点的其他字符串,然后使用英文点进行分割后对应比较即可。主要用到下面俩个方法,可以将它封装到工具方法中使用。
getNonStringVersionNum 去除非英文句号和数字的字符
public static String getNonStringVersionNum(String versionNum) {
StringBuilder result = new StringBuilder();
if (versionNum != null && !versionNum.isEmpty()) {
for (int i = 0; i < versionNum.length(); i++) {
if (versionNum.charAt(i) >= 48 && versionNum.charAt(i) <= 57 || versionNum.charAt(i) == 46) {
result.append(versionNum.charAt(i));
}
}
}
return result.toString();
}
上面的方法执行过后会将例如:v1.0.0转化为1.0.0
compareVersionNum 通过英文句号分割后进行比较
public static int compareVersionNum(String versionNum1, String versionNum2) {
String[] nums1 = versionNum1.split("\\.");
String[] nums2 = versionNum2.split("\\.");
int minLen = Math.min(nums1.length, nums2.length);
for (int i = 0; i < minLen; i++) {
if (!nums1[i].equals(nums2[i])) {
return Integer.parseInt(nums1[i]) - Integer.parseInt(nums2[i]);
}
}
return 0;
}
该方法返回三种情况:大于零、小于零和等于零,对应List.sort中Comparator返回的值
使用方法
public static void main(String[] args) {
List<String> versionList = new ArrayList<>();
versionList.add("v1.0.0");
versionList.add("v2.0.0");
versionList.add("v1.0.1");
versionList.add("v1.0.2");
versionList.add("v1.1.0");
versionList.add("v0.1.0");
versionList.add("v1.2.1");
versionList.sort((o1, o2) -> {
String nonStringVersionNum1 = getNonStringVersionNum(o1);
String nonStringVersionNum2 = getNonStringVersionNum(o2);
if (nonStringVersionNum1.isEmpty()) {
nonStringVersionNum1 = "0";
}
if (nonStringVersionNum2.isEmpty()) {
nonStringVersionNum2 = "0";
}
return -compareVersionNum(nonStringVersionNum1, nonStringVersionNum2); // 前面不加减号式按照正序排列加上式倒序排列
});
System.out.println(versionList);
}
上面我们首先创建了一个乱序的版本号集合,然后我们在sort方法中调用上面的俩个方法,需要注意的是我通过下面的代码将不包含数字的版本号返回字符串0,这样不包含数字的版本号在我这个方法里面会排到最后,如果是正序排列的话会排到第一个,决定正序还是倒序的关键就在最后返回调用方法值那里,加减号就是倒序,反之为正序。
运行结果
[v2.0.0, v1.2.1, v1.1.0, v1.0.2, v1.0.1, v1.0.0, v0.1.0]

浙公网安备 33010602011771号