`

Java实现客户端版本大小判断

    博客分类:
  • Java
阅读更多

        由于移动客户端系统、版本碎片化,因此很多后端业务不可避免的要对版本兼容做处理,每一个发布的app,都会在请求服务上携带这个版本,确保服务端实现新老版本兼容和服务隔离。

 

        在处理版本号的过程中,有很多时候要对新老版本做大小判断,因此写了一段对android、iphone和ipad等多个app的终端进行版本处理的代码,通过比较版本号,实现对app的服务分区间管理的功能。

 

/**
     * 这个方法通过配置的appName和version的map和请求的appNameVersion做对比,
     * 从而对不同系统终端的不同版本进行分片输出业务逻辑
     * 比如mytest_iphone_1.3.0和mytest_iphone_1.3.0.11,mytest_iphone_1.2.2比较版本高低大小
     * @param appNameVersionMap 当有IOS和android两个系统的时候,可以配置map与当前的app版本进行对比,可以配置参照值mytest_android_5.3.0,mytest_iphone_1.3.2,mytest_ipad_1.3.0
     * @param appNameVersion 类似 12345@mytest_iphone_1.3.0
     * @return true or false appNameVersion>=appNameVersionMap 的其中一个值,方法返回true,否则返回false;
     */
    public static boolean compareAppNameAndVersionMapWithAppNameVersion(Map<String, String> appNameVersionMap, String appNameVersion) {
        char[] appNameVersionCharArray = appNameVersion.toCharArray();
        for (Map.Entry<String, String> entry : appNameVersionMap.entrySet()) {
            String clientName = entry.getKey(); //"taobao_iphone" : 1.2.0.1 "taobao_android" : "3.0.2" appNameVersion=taobao_iphone_1.0.0
            String version = entry.getValue();
            char[] clientCharArr = clientName.toCharArray();
            char[] versionCharArr = version.toCharArray();

            int i = isContainsCharArr(appNameVersionCharArray, clientCharArr);
            if (i < appNameVersionCharArray.length) {
                boolean isBigger = true;
                boolean goOn = true;
                int j = 0;
                while (goOn) {
                    if (j < versionCharArr.length && !isNumbericChar(versionCharArr[j])) {
                        j++;
                    }
                    if (i < appNameVersionCharArray.length && !isNumbericChar(appNameVersionCharArray[i])) {
                        i++;
                    }
                    if (j >= versionCharArr.length) {
                        /**myapp_android#4.2.2.0.1 跟1234@myapp_android_4.2.2.0比较的特殊情况*/
                        while (i < appNameVersionCharArray.length) {
                            if (appNameVersionCharArray[i] > '0' && appNameVersionCharArray[i] <= '9') {
                                return true;
                            }
                            i++;
                        }
                        return true;
                    }
                    if (i >= appNameVersionCharArray.length) {
                        /**myapp_android#4.2.2.0 跟1234@myapp_android_4.2.2.0.1比较的特殊情况*/
                        while (j < versionCharArr.length) {
                            if (versionCharArr[j] > '0' && versionCharArr[j] <= '9') {
                                return false;
                            }
                            j++;
                        }
                        return true;
                    }
                    if (isNumbericChar(appNameVersionCharArray[i]) && isNumbericChar(versionCharArr[j])) {
                        int ttidNextVersionPlace = getNextVersionNumberPlace(appNameVersionCharArray, i);
                        int verNextVersionPlace = getNextVersionNumberPlace(versionCharArr, j);
                        if (ttidNextVersionPlace == verNextVersionPlace) {
                            if (appNameVersionCharArray[i] > versionCharArr[j]) {
                                return true;
                            }
                            if (appNameVersionCharArray[i] < versionCharArr[j]) {
                                return false;
                            }
                            i++;
                            j++;
                        } else {
                            return ttidNextVersionPlace > verNextVersionPlace;
                        }
                    }
                }
                return isBigger;
            }
        }
        return false;
    }

    /***
     * 版本号可能是多位数目 比如 5.2.6.6和5.2.6.10
     * 取得下一个版本号的位数
     */
    public static int getNextVersionNumberPlace(char[] charArray, int i) {
        int count = 1;
        while (i < charArray.length - 1 && isNumbericChar(charArray[i + 1])) {
            i++;
            count++;
        }
        return count;
    }

    /**
     * 返回匹配成功的下一个index
     * 方法未判空注意
     **/
    private static int isContainsCharArr(char[] charArr, char[] searchArr) {
        int i = 0;
        while (i < charArr.length) {
            int j = 0;
            while (i < charArr.length && j < searchArr.length && charArr[i++] == searchArr[j++]) ;
            if (j == searchArr.length && i < charArr.length) {
                break;
            }
        }
        return i;
    }

    private static boolean isNumbericChar(char ch) {
        return ch >= '0' && ch <= '9';
    }

 

   如果要实现区间判断,那么只需要对上述方法进行包装即可

分享到:
评论

相关推荐

    Java实现比较版本号

    涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法;  这需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用:  ...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    java jdk实列宝典 光盘源代码

    java的声音处理,介绍java中如何处理声音,包括实现响铃,播放wav,au等音频文件,以及控制声音的大小和音量,Beep.java; 媒体播放器,JMFMediaPlayer.java; 12反射 是java程序开发的特征之一,允许java程序对自身...

    java面试题

    65. 什么是java序列化,如何实现java序列化? 48 65.1. java序列化、反序列化 48 65.2. 对象的序列化主要有两种用途: 48 65.3. 对象序列化包括如下步骤: 49 65.4. 对象反序列化的步骤如下: 49 66. 反射机制 49 ...

    Android实现检查并下载APK更新、安装APK及获取网络信息的方法

    主要包括了下载和安装APK、检查Apk更新、显示’已经是最新’或者’无法获取版本信息’对话框、获取当前客户端版本信息、显示版本更新通知对话框、显示下载对话框、判断是否挂载了SD卡、显示文件大小格式:2个小数点...

    JAVA面试题最全集

    7.Java多态的实现(继承、重载、覆盖) 8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能...

    优化Java堆大小的5个技巧

    1.JVM:对难以理解的东西产生恐惧... 客户端环境面临着有规律的OutOfMemoryError错误并且对业务造成了很大的影响。 你的开发团队要在如此大的压力下去解决这个问题,通常会怎么做?  用谷歌搜索引擎找到类似的问题

    struts2 图片上传,图片大小,图片格式

    可直接运行,包含jar文件,struts2 图片上传,图片大小,图片格式的限制,客户端文件类型判断等

    java范例开发大全源代码

     实例81 按字母顺序比较大小 110  实例82 首尾相连 111  实例83 字符串间的比较 112  实例84 字符集的解码方法 113  实例85 寻找指定字符第一次出现的位置 114  实例86 寻找指定字符最后出现的位置 ...

    java范例开发大全

    实例285 Echo服务的客户端是如何实现的? 556 实例286 检测本机的服务端口 558 实例287 下载的页面不丢失链接 559 实例288 如何对网页进行重新定向 560 实例289 在Internet上搜索对象 560 实例290 LAN使用代理服务器...

    Java面试宝典-经典

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

    Java面试宝典2010版

    74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...

Global site tag (gtag.js) - Google Analytics