Java实现版本号比较算法

作者: ʘᴗʘ发布时间:2021-10-18 12:14 浏览量:898 点赞:585 售价:0

最近在开发《Maven Jar包新版本检测工具》的时候,需要一个算法来比较各种版本号的大小。简单的比如1.2.3这种纯数字的,复杂的则包含了特殊字符和字母,比如1.2.3-Beta1之类的。网上找了一下,大多都只支持纯数字的版本号判断。所以我把这些算法简单改造了一下,能够支持数字+字母+特殊字符的判断了。

PS:因为字母版本号命名基本没有规范,所以也就没有一个特定的规则去判断大小了。如果你要判断的版本号带有字母,请在本文代码的基础上再定制。

代码思路就是,先把各种特殊字符、字母替换一下,然后根据.来切分版本号字符串为数字数组。然后判断分段判断数字的大小,从而计算出版本号的大小。

Java版本号比较算法,代码如下:

public static int compareVersion(String version1, String version2) {

        version1 = version1.replace("_", ".").replace("-", ".").replaceAll("[^\\d.]+", "0");
        version2 = version2.replace("_", ".").replace("-", ".").replaceAll("[^\\d.]+", "0");

        version1 = version1.toLowerCase(Locale.ROOT);
        version2 = version2.toLowerCase(Locale.ROOT);

        String[] s1 = version1.split("\\.");
        String[] s2 = version2.split("\\.");
        int len1 = s1.length;
        int len2 = s2.length;
        int i, j;
        for (i = 0, j = 0; i < len1 && j < len2; i++, j++) {

            int big = 1;
            int small = -1;

            if (i == 0 && j == 0) {
                //大版本不一致
                big = 2;
                small = -2;
            }

            if (Long.parseLong(s1[i]) > Long.parseLong(s2[j])) {
                return big;
            } else if (Long.parseLong(s1[i]) < Long.parseLong(s2[j])) {
                return small;
            }
        }
        while (i < len1) {
            if (Long.parseLong(s1[i]) != 0) {
                return 1;
            }
            i++;
        }
        while (j < len2) {
            if (Long.parseLong(s2[j]) != 0) {
                return -1;
            }
            j++;
        }
        return 0;
}

版本比较函数的入参是需要比较的两个版本号字符串,返回结果是-2-1012

  • 如果version1大于version2,则返回正数;
  • 如果version1等于version2,则返回0;
  • 如果version1小于version2,则返回负数;

如果version1、version2相差的是大版本(大版本是指第一个.之前的数字),则返回的结果是2或者-2

版权声明:《Java实现版本号比较算法》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.coderbbb.com/articles/18

其它推荐:

  • 通过Maven将指定Jar包下载到指定的本地目录

    本文介绍如何使用maven把一些需要下载到本地的Jar包下载下来。有时候我们开发一些java项目的时候,并没有使用maven管理包,但是又需要一些常用的包,那么可以使用maven来将这些包下载到本地,从而导入项目

  • java使用Gzip压缩Json字符串

    本文提供了一个使用java内置的Gzip算法压缩字符串(比如JSON)的压缩、解压缩类,使用本文的代码可以方便的压缩将JSON的体积压缩一半以上。

  • 微软win10官方高清桌面壁纸自动更换软件

    Bing Wallpaper壁纸软件号称:“通过一张照片探索世界”。强烈推荐使用这款微软官方Win10壁纸软件,可以自动更换壁纸。所有的壁纸都是世界各地景色的高清大图,适合喜欢简洁、清爽的朋友。

  • 【终极方案】java通过Selenium调用chrome实现html转图片

    本文介绍了HTML转图片的常用技术和方案,并提出了各个方案的缺点。最后给出了基于selenium和chrome的完美解决方案。使用该方案,可以完美的转化各种HTML、CSS、JS,只要chrome能正常展示的,就能正常截图!

  • Java Springboot使用OkHttp实现微信支付API-V3签名、证书的管理和使用

    新版的微信支付API-V3中,最让人头疼的就是各种安全措施。各种凌乱的概念让人摸不着头脑。比如微信平台证书、商户证书、API KEY等等概念。本文从零开始,引导读者一步一步实现了整个微信支付的安全验证,通过本文可以快速完成微信支付的安全开发。

  • 【就缺个程序员系列】创业公司技术科普

    【就缺个程序员系列】是IT行业多年工作经验的总结,使用大白话给非技术出身的你一些踏踏实实的干货。如果你正在创业,请阅读它!

  • Springboot整合Redis和redis常用操作演示

    本文介绍如何在springboot中引入redis数据库,并执行各类redis操作。过程非常简单,只要引入一些jar包,并配置redis连接信息即可。

  • 恶意采集器模拟百度蜘蛛UserAgent怎么防御?

    网站总是被各种采集器、恶意软件模拟成搜索引擎蜘蛛采集?通过本文介绍的方法,可以彻底屏蔽伪造搜索引擎UserAgent的恶意请求,保护系统安全。

  • Intellij IDE代码行数统计插件Statistic推荐

    本文介绍了一种能够快速统计IntelliJ项目代码行数的插件:Statistic,通过该插件可以快速查看各个项目、目录的代码行数,还能具体查看项目中不同代码语言的具体行数,十分方便。

  • springboot+thymeleaf+vue使用IntelliJ+Webstorm开发详细介绍

    本文介绍了如何使用webstorm和IntelliJ开发一个springboot+thymeleaf+vue的项目,主要讲解了作者在开发中遇到的SEO问题和搭建webstorm+IntelliJ工作流程的方法。

user

ʘᴗʘ

77
文章数
73128
浏览量
57260
获赞数
67.80
总收入