Java实现版本号排序算法

源数据如下,要求对该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版权协议,转载请附上原文出处链接和本声明。