String.compareTo()方法用于版本号比较的坑
来源:互联网 发布:centos macaddr 编辑:程序博客网 时间:2024/05/22 15:41
最近项目中需要比较客户端版本,项目之初使用String.compareTo()方法进行版本比较,客户端版本如:8.2.3,各级版本号都为数字且以’.’分割,当某一级别版本号大于等于10时,String.compareTo()方法返回错误。
一、String.compareTo()比较版本号
通过String.compareTo()比较不同的版本号,结果如下:
public class Test { public static void main(String[] args) { System.out.println("\"8.2.3\".compareTo(\"8.2.3\") : " + "8.2.3".compareTo("8.2.3")); System.out.println("\"8.2.3\".compareTo(\"8.7.3\") : " + "8.2.3".compareTo("8.7.3")); System.out.println("\"8.2.3\".compareTo(\"8.1.1\") : " + "8.2.3".compareTo("8.1.1")); System.out.println("\"8.2.3\".compareTo(\"8.2.15\") : " + "8.2.3".compareTo("8.2.15")); System.out.println("\"8.2.3\".compareTo(\"8.2.a\") : " + "8.2.3".compareTo("8.2.a")); System.out.println("\"8.2.3\".compareTo(\"8.2.1.236\") : " + "8.2.3".compareTo("8.2.1.236")); System.out.println("\"8.2.3\".compareTo(\"8.8.1.236\") : " + "8.2.3".compareTo("8.8.1.236")); System.out.println("\"8.2.3\".compareTo(\"9.4\") : " + "8.2.3".compareTo("9.4")); System.out.println("\"8.2.3\".compareTo(\"6.4\") : " + "8.2.3".compareTo("6.4")); }}结果:"8.2.3".compareTo("8.2.3") : 0"8.2.3".compareTo("8.7.3") : -5"8.2.3".compareTo("8.1.1") : 1"8.2.3".compareTo("8.2.15") : 2"8.2.3".compareTo("8.2.a") : -46"8.2.3".compareTo("8.2.1.236") : 2"8.2.3".compareTo("8.8.1.236") : -6"8.2.3".compareTo("9.4") : -1"8.2.3".compareTo("6.4") : 2
以上大部分比较结果正确,但是版本号8.2.3与8.2.15的比较结果出现错误,8.2.3的版本应该比8.2.15的版本小。
String.compareTo()源码如下,该方法比较逻辑为:按字符比较两个字符串,返回前k(两字符串中较短字符串的长度)个字符中第一个不同字符的差值,如果前k个字符都相同,则返回两个字符串的长度差值。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];... public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }...}
二、正确的版本号比较方法
String.compareTo()方法适用于按字符比较的场景,不适用于版本号比较。我们使用到的客户端版本都是数字加分隔符(”.”)组合的,正确的方式应该按分隔符将版本号切分为各级版本,然后按级别比较版本号,如下:
public class Test { public static void main(String[] args) { Test test = new Test(); System.out.println("compare(\"8.2.3\", \"8.2.3\") : " + test.compare("8.2.3", "8.2.3")); System.out.println("compare(\"8.2.3\", \"8.7.3\") : " + test.compare("8.2.3","8.7.3")); System.out.println("compare(\"8.2.3\", \"8.1.1\") : " + test.compare("8.2.3","8.1.1")); System.out.println("compare(\"8.2.3\", \"8.2.15\") : " + test.compare("8.2.3","8.2.15")); System.out.println("compare(\"8.2.3\", \"8.2.1.236\") : " + test.compare("8.2.3","8.2.1.236")); System.out.println("compare(\"8.2.3\", \"8.8.1.236\") : " + test.compare("8.2.3","8.8.1.236")); System.out.println("compare(\"8.2.3\", \"9.4\") : " + test.compare("8.2.3","9.4")); System.out.println("compare(\"8.2.3\", \"6.4\") : " + test.compare("8.2.3","6.4")); } public int compare(String v1, String v2) { if(StringUtils.isBlank(v1) && StringUtils.isBlank(v2)) { return 0; } else if(StringUtils.isBlank(v1)) { return -1; } else if(StringUtils.isBlank(v2)) { return 1; } int [] varr1 = getVersionArray(v1); int [] varr2 = getVersionArray(v2); int lim = Math.min(varr1.length, varr2.length); int k = 0; while(k < lim) { if(varr1[k] == varr2[k]) { k ++; continue; } return varr1[k] > varr2[k] ? 1 : -1; } if(varr1.length == varr2.length) { return 0; } return varr1.length > varr2.length ? 1 : -1; } public int [] getVersionArray(String v) { String [] sarray = StringUtils.split(v, "."); int [] varray = new int[sarray.length]; int k = 0; while (k < sarray.length) { varray[k] = Integer.parseInt(sarray[k]); k ++; } return varray; }}结果:compare("8.2.3", "8.2.3") : 0compare("8.2.3", "8.7.3") : -1compare("8.2.3", "8.1.1") : 1compare("8.2.3", "8.2.15") : -1compare("8.2.3", "8.2.1.236") : 1compare("8.2.3", "8.8.1.236") : -1compare("8.2.3", "9.4") : -1compare("8.2.3", "6.4") : 1
阅读全文
0 0
- String.compareTo()方法用于版本号比较的坑
- String的CompareTo方法
- String 的 compareTo 方法
- String的compareTo方法
- String的compareTo()方法
- String的compareTo方法
- String的compareTo方法
- 使用String类的compareTo()方法比较两个日期字符串
- JAVA 关于String的CompareTo方法即字典序比较
- String 的 compareTo() 方法
- String.compareTo()比较大小
- String的几种比较方法对比(Compare,CompareTo, CompareOrdinal、Equals)
- [C#]简单重写IComparer接口,实现自己的String.CompareTo 方法,自定义比较规则。
- String的几种比较方法对比(Compare,CompareTo, CompareOrdinal、Equals)
- String类中自动重写compareTo( )方法对汉字的比较
- String的几种比较方法对比(Compare,CompareTo, CompareOrdinal、Equals)
- String的compareTo方法的详细说明
- bigDecimal的比较方法 equals和compareTo
- tomcat修改端口号
- C++STL库之algorithm库简介
- hdu 6095
- 用ps和js制作我的个人小游戏
- MapStruct处理Java中实体与模型间不匹配属性转换
- String.compareTo()方法用于版本号比较的坑
- nrf51822单片机驱动ESP8266模块中遇到的问题总结
- Linux 镜像文件下载
- Andrew Ng机器学习课程笔记--week3(逻辑回归&正则化参数)
- kindeditor自定义工具栏
- 第三方登录之支付宝登录
- CentOS7.2下Hadoop2.7.2的集群搭建
- 一些蒟蒻认为的好题(趣题)【更新中】
- 怪物属性表-等级地图