比较两个“语义化版本“ Java实现

题目要求:

请根据语义化版本的要求 https://semver.org/lang/zh-CN/ ,比较两个"语义化版本"

传入两个形如x.y.z的字符串,比较两个语义化版本的大小。如果version1小于version2,返回-1;如果version1大于version2,返回1。如果二者相等,返回0。

注意,如果传入的字符串形如x,则其等价于x.0.0。 如果传入的字符串形如x.y,则其等价于x.y.0。

方法有两个参数:

version1 传入的版本字符串1,支持x/x.y/x.y.z,你可以假定传入的字符串一定是合法的语义化版本

version2 传入的版本字符串2,支持x/x.y/x.y.z,你可以假定传入的字符串一定是合法的语义化版本

返回结果:

-1/0/1 当version1 小于/等于/大于 version2时

解题思路: 将语义化版本拆解成三个int值,按顺序对比两个语义化版本每个值得大小。

例如1.10.01.9.1比,1.10.0更大,返回结果1

普通实现版:

	// 对比两个版本大小
	public static int compare(String version1, String version2) {
    	// 填充完整版本号
        String[] version1Arr = getAllVersion(version1).split("\\.");
        // 填充完整版本号
        String[] version2Arr = getAllVersion(version2).split("\\.");
        // 对比大版本
        int res = compareInt(Integer.parseInt(version1Arr[0]), Integer.parseInt(version2Arr[0]));
        if (res != 0) {
            return res;
        }
        // 对比中版本
        res = compareInt(Integer.parseInt(version1Arr[1]), Integer.parseInt(version2Arr[1]));
        if (res != 0) {
            return res;
        }
        // 对比小版本
        return compareInt(Integer.parseInt(version1Arr[2]), Integer.parseInt(version2Arr[2]));
    }

	// 比较两个数字的大小
    private static int compareInt(int version1, int version2) {
        if (version1 < version2) {
            return -1;
        } else if (version1 > version2) {
            return 1;
        } else {
            return 0;
        }
    }

	// 填充不完整的version,例如将1,补充成1.0.0,将1.1补充成1.1.0
    private static String getAllVersion(String version) {
        String[] versionArr = version.split("\\.");
        String newVersion = versionArr[0];
        for (int i = 1; i <= 2; i++) {
            if (versionArr.length > i) {
                newVersion += "." + versionArr[i];
            } else {
                newVersion += ".0";
            }
        }
        return newVersion;
    }

精简实现版:

	// 版本语义最大长度
	private static final int MAX_LENGTH = 3;

    public static int compare(String version1, String version2) {
    	// 拆分
        String[] version1Arr = version1.split("\\.");
        String[] version2Arr = version2.split("\\.");
        for (int i = 0; i < MAX_LENGTH; i++) {
        	// 数组长度不够 0 来填补,否则直接转换为int
            int v1 = version1Arr.length > i ? Integer.parseInt(version1Arr[i]) : 0;
            int v2 = version2Arr.length > i ? Integer.parseInt(version2Arr[i]) : 0;
            // 不相等则比较大小,分出结果
            if (v1 != v2) {
                return v1 < v2 ? -1 : 1;
            }
        }
        // 完全相等返回0
        return 0;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值