`

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之类的方法;  这需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用:  ...

    Memcached之java客户端开发

    **Memcached之Java客户端开发详解** Memcached是一种高性能、分布式内存对象缓存系统,用于减少数据库负载,提高网站性能。它通过将数据存储在内存中,以快速响应来自应用程序的请求,避免了反复读取数据库的开销。...

    基于Java写minio客户端实现上传下载文件

    在本文中,我们将深入探讨如何使用Java来实现MinIO客户端,以便进行文件的上传和下载操作。MinIO是一个高度可扩展的对象存储服务器,适合用于存储和检索大量的非结构化数据,如图片、文档、视频等。它提供了一个简单...

    优化Java堆大小的5个技巧

    需要注意的是,在Java 7及以后版本中,永久代已经被Metaspace取代。 - **Native Heap (C-Heap)**:所有JVM厂商都会使用的一种内存区域,主要用于存储非Java代码的内存需求。 ##### **1.2 学习JVM内存管理的重要性**...

    安卓SD卡文件管理更新信息相关-安卓微盘Java实现服务器Android端作为客户端全套代码.rar

    【标题】中的“安卓SD卡文件管理更新信息相关-安卓微盘Java实现服务器Android端作为客户端全套代码.rar”提到了几个关键概念,分别是安卓SD卡文件管理、更新信息、安卓微盘、Java实现的服务器以及Android客户端。...

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

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

    java 实现比较版本号功能

    在Java编程中,比较版本号是一项常见的任务,特别是在处理客户端软件更新或依赖管理时。版本号通常由一系列数字和(可选的)字母组成,例如`1.3.20.8`或`6.82.20160101`,甚至包含字母后缀如`8.5c`。直接使用字符串...

    JAVA实现的猜数字游戏

    可以使用函数(方法)来封装不同功能,如生成随机数、处理用户输入、判断大小等,使代码更易于理解和维护。 总之,这个JAVA猜数字游戏展示了JAVA的基本语法、控制流、输入/输出、随机数生成以及条件判断等核心概念...

    Java实现文件下载功能

    ### Java实现文件下载功能 在IT领域,尤其是Web开发中,文件下载是常见的需求之一,例如用户可能需要从服务器下载各种类型的文件,如文档、图片、压缩包等。本文将详细解析如何使用Java来实现这一功能,特别是针对...

    网络五子棋(用java实现,完整的源代码)

    本项目提供了完整的源代码,大小仅为94.1KB,旨在展示如何利用Java技术来构建一个简单而实用的网络应用。下面我们将深入探讨该项目中的关键知识点。 1. **Java基础**: - **面向对象编程**:五子棋游戏是基于对象...

    Java实现的五子棋

    本项目是基于Java实现的五子棋游戏,它允许用户进行红黑对垒,通过棋盘交叉线计算来判断胜负,下面我们将深入探讨这个项目的相关知识点。 首先,我们要理解Java的基础架构。Java是一种面向对象的编程语言,其设计...

    android上传文件,java服务器接收 客户端与服务器端两端上传代码

    本场景中,我们关注的是使用Java服务器(通常为Java Servlet)接收Android客户端上传的文件。以下是对整个过程的详细解释: **Android客户端上传文件** 1. **创建HTTP请求**:Android客户端首先需要构建一个HTTP...

    Java实现的联机多人对战五子棋游戏,带聊天功能

    - `wuziqiFinalServer.java`:这应该是服务器端的实现,负责处理客户端的连接请求,维护多个客户端之间的同步,以及游戏状态的管理。它可能使用了Java的Socket编程来建立客户端与服务器之间的通信通道。 2. **...

    Java实现文件下载并解决中文文件名乱码

    ### Java实现文件下载并解决中文文件名乱码 在日常的Web开发中,经常会遇到需要让用户下载文件的需求,尤其是在企业级应用中。然而,在实际操作过程中可能会遇到一个常见问题:当文件名包含中文字符时,下载后的...

    java源码包3

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

    java源码包2

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

    详解java实现简单扫码登录功能(模仿微信网页版扫码)

    本文将详细介绍 Java 实现简单扫码登录功能的实现过程,包括生成二维码、循环请求服务端、判断是否被扫、超时失效功能、登录成功后产生 sessionId 传到页面使用 js 保存 cookie 等步骤。 生成二维码 在生成二维码...

    hbase的java客户端api操作示例代码.zip

    HBase是一款分布式、高性能、基于列族的NoSQL数据库,主要设计用于...以上就是针对“hbase的java客户端api操作示例代码”的主要知识点。通过这些示例,开发者可以更好地理解和实践如何在Java环境中与HBase进行交互。

    Servlet实现猜数字大小游戏

    在这个游戏应用中,Servlet将接收用户的输入(猜测的数字),判断大小,并给出反馈。 描述中的"利用session完成设计"意味着我们需要使用HttpSession接口来存储用户的状态信息。在游戏过程中,服务器需要记住用户的...

    java判断试题.pdf

    ### Java判断题知识点详解 #### 1. JSP 包含指令 (`&lt;jsp:include&gt;`) **知识点**: `&lt;jsp:include&gt;` 指令在 JSP 文件中的作用是在编译时将其他 JSP 文件的内容合并到当前 JSP 文件中。 **解析**: 正确。`...

Global site tag (gtag.js) - Google Analytics