源数据如下,要求对该list针对osVersion字段进行排序
[
{
"osVersion": "11.3.1",
"num": 100
},
{
"osVersion": "5.1.2",
"num": 43
},
{
"osVersion": "10.3",
"num": 23
},
{
"osVersion": "7.0.3",
"num": 55
},
{
"osVersion": "15.1.1",
"num": 47
}
]
下面贴可执行代码
package xxx.xxx.xxx.test;
import com.alibaba.fastjson.JSON;
import org.springframework.util.ObjectUtils;
import java.util.Comparator;
import java.util.List;
/**
* @author panzx
**/
public class VersionSort {
public static class VersionData {
private String osVersion;
private Long num;
public String getOsVersion() {
return osVersion;
}
public void setOsVersion(String osVersion) {
this.osVersion = osVersion;
}
public Long getNum() {
return num;
}
public void setNum(Long num) {
this.num = num;
}
}
public static void main(String[] args) {
// 这里jsonStr放上面贴出来的源数据
String jsonStr = "";
List<VersionData> versionDataList = JSON.parseArray(jsonStr, VersionData.class);
versionDataList.sort(Comparator.comparing(item -> getOsVersionValue(item.osVersion)));
System.out.println(JSON.toJSONString(versionDataList));
}
/**
* 版本号转为一个虚拟的值,用于排序
* 目前版本号支持最多三位,如1.2.3
* 如后期增加位数,将算法中的j的初始值增大即可
* 核心思想:以.为分隔符,分割出来的几块做10进制汇总处理
* (1.2.3 = 1*10^2 + 2*10^1 + 3*10^0)
* (10.3.0 = 10*10^2 + 3*10^1 + 0*10^0)
*
* @param osVersion
* @return
*/
private static Integer getOsVersionValue(String osVersion) {
if (ObjectUtils.isEmpty(osVersion)) {
return 0;
}
String[] arr = osVersion.split("\\.");
Integer value = 0;
for (int i = 0, j = 2; i < arr.length; i++, j--) {
Double val = Math.pow(10, j);
value += Integer.parseInt(arr[i]) * val.intValue();
}
return value;
}
}
执行main方法,成功得到排序结果,如果需要逆序,则对结果集进行一次reverse即可
[{
"num": 43,
"osVersion": "5.1.2"
}, {
"num": 55,
"osVersion": "7.0.3"
}, {
"num": 23,
"osVersion": "10.3"
}, {
"num": 100,
"osVersion": "11.3.1"
}, {
"num": 47,
"osVersion": "15.1.1"
}]
版权声明:本文为StuartPan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。