涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法;

这就需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用:

通常版本号如:1.3.20.8,6.82.20160101,8.5a/8.5c等;

通用规则就是,先将版本字符串按照点号分割,然后主版本与主版本比较、此版本与此版本比较,如此按序一级一级往后比较,直到有分出大小;

值得注意的是,很多比较版本号的方法都先将字符串转换成int或者double类型,这样做未必通用,因为可能含有字母,如8.5c这样的版本号;

通用的方式依然是将分割后的字符串当做字符串来比较,不过,比较字符串之前,先比较位数;

比较版本号的方法示例:

  1. /**
  2. * 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0
  3. * @param version1
  4. * @param version2
  5. * @return
  6. */
  7. public static int compareVersion(String version1, String version2) throws Exception {
  8. if (version1 == null || version2 == null) {
  9. throw new Exception("compareVersion error:illegal params.");
  10. }
  11. String[] versionArray1 = version1.split("\\.");//注意此处为正则匹配,不能用".";
  12. String[] versionArray2 = version2.split("\\.");
  13. int idx = 0;
  14. int minLength = Math.min(versionArray1.length, versionArray2.length);//取最小长度值
  15. int diff = 0;
  16. while (idx < minLength
  17. && (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//先比较长度
  18. && (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//再比较字符
  19. ++idx;
  20. }
  21. //如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
  22. diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
  23. return diff;
  24. }

注意:其中 split 方法入参为正则匹配表达式,不能用"."("."在正则表达式里匹配任何值),需要用"\\.",才算是按点号分割;

这样,先分割成子串数组,再挨个比较子版本号,比较子版本号时,先比较位数,位数大的就大,位数一样时再按字符串比较方式比较;

如果全部比较完(其中一个版本号比较完)之后,再看一下哪个版本号有更更多的子版本号,也就是分割后的数组长度,有子版本号的为大;

这样就比较完善地考虑了各种情况,并比较出版本号大小;包括有字母后缀的也可以使用;

如 "9.9", "10.8.8.6" ,如果直接按字符串比较,则会前者大,后者小,而明显是错误的;分割后比较第一个主版本9与10,从位数上,就已经得出结果后者大;

再如 "9.9b", "9.8a" 等也适用,如果用转换成int或者double的方法就不适用;

欢迎指正!

http://blog.csdn.net/sowhat_ah/article/details/43955337

Java实现比较版本号的更多相关文章

  1. 微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决

    微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决 echostr校验失败,请您检查是否正确解密并输出明文echostr 异常java.securi ...

  2. JAVA 软件升级版本号比较

    简单版本号比较: public class CompareVersion {   public static void main(String[] args) { // TODO Auto-gener ...

  3. 检查java class的版本号

    补丁总是会一遍又一遍的打,越打越多 有时候,就担心有人不小心把高版本的class打到低版本jre运行的环境中 简单写了点代码,检查文件夹中class的版本号 package org.wee.cv; i ...

  4. java比较客户端版本号

    参考文章:http://www.jb51.net/article/70317.htm 关键点 为什么不能使用String.compareTo方法来比较客户端版本号? 举个例子,之前客户端版本号为:9. ...

  5. JAVA 公众微信的开放源码项目管理合作伙伴招募的版本号

    大家好:       jeecg开源社区.现在正在进行"JAVA 开放源码的版本号项目微信公共账号"工作,有兴趣的朋友一起參与. 截止时间:20140510 採用技术: 1. JE ...

  6. Atitit.html解析器的选型&#160;jsoup&#160;nsoup&#160;,java&#160;c#&#160;.net&#160;版本号

    Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号 1. 框架选型的要求 1 1.1. 文档多 1 1.2. 跨平台 1 2. html解析器特性: 1 2 ...

  7. java代码打包成jar以及转换为exe

    教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...

  8. java安全沙箱(四)之安全管理器及Java API

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  9. java System.getProperty()参数大全

    java.version Java Runtime Environment versionjava.vendor Java Runtime Environment vendorjava.vendor. ...

随机推荐

  1. [原]使用node-mapnik生成openstreetmap-carto风格的瓦片

    上回说到如何在CentOS上部署node-mapnik,本想着接下来学习如何使用node-mapnik生成openstreetmap的瓦片图,没想到在接下来的近40天的时间里忙成了狗!好不容易等到元旦 ...

  2. .net(C#)中this关键字

    使用this关键字引用成员变量使用this关键字在自身构造方法内部引用其它构造方法使用this关键字代表自身类的对象使用this关键字引用成员方法 在一个类的方法或构造方法内部,可以使用"t ...

  3. Ceph RGW 创建默认的pool

    使用Ceph-deploy完成RGW服务部署后(最好是在部署RGW服务前建立如下这些pool),使用sudo ceph osd lspools 命令,会发现RGW自动以默认参数创建了N个rgw相关的p ...

  4. 怎么用XMind辅助电商工作

    随着电商的迅猛发展,突出了电商运营管理的重要性.能不能做好电商,就要看他的管理做的好不好,全面不全面!电商的突破与进步,离不开全方位的协同管理.之前,小编有给大家介绍过电商量化管理的四大利器:XMin ...

  5. Android Studio导入项目遇到的问题

    [ Failed to resolve: com.afollestad:material-dialogs:0.7.5.5] 解决办法: 1.打开app目录下的build.gradle文件,然后在and ...

  6. oracle Entity db.Database.SqlQuery ORA-01843: 无效的月份

    原因是oracle的日期格式化格式和本地语言环境的日期格式不一致导致的. 一般情景为oralce格式为英文格式 本地服务器或者开发机的环境为中文环境. 使用Dbcontext 实例一般不会有问题. 但 ...

  7. csv to splite db form

    termsql: https://github.com/tobimensch/termsql termsql -i textfile -d ',' -o sqlite.db 添加列名 termsql ...

  8. C++ 自由存储区是否等价于堆?

    "free store" VS "heap" 当我问你C++的内存布局时,你大概会回答: "在C++中,内存区分为5个区,分别是堆.栈.自由存储区.全 ...

  9. javascrip for 循环数组事件绑定

    //radio选择填充,字段 var radioArray = ["F_RegisterCode", "F_Subjection", "F_Mecha ...

  10. 蓝牙4.0(BLE)开发

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/26740237 作者:小马 IOS学习也一段时间了,该上点干货了.前段时间研究了一下 ...