由于移动客户端系统、版本碎片化,因此很多后端业务不可避免的要对版本兼容做处理,每一个发布的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'; }
如果要实现区间判断,那么只需要对上述方法进行包装即可
相关推荐
涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法; 这需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用: ...
**Memcached之Java客户端开发详解** Memcached是一种高性能、分布式内存对象缓存系统,用于减少数据库负载,提高网站性能。它通过将数据存储在内存中,以快速响应来自应用程序的请求,避免了反复读取数据库的开销。...
在本文中,我们将深入探讨如何使用Java来实现MinIO客户端,以便进行文件的上传和下载操作。MinIO是一个高度可扩展的对象存储服务器,适合用于存储和检索大量的非结构化数据,如图片、文档、视频等。它提供了一个简单...
需要注意的是,在Java 7及以后版本中,永久代已经被Metaspace取代。 - **Native Heap (C-Heap)**:所有JVM厂商都会使用的一种内存区域,主要用于存储非Java代码的内存需求。 ##### **1.2 学习JVM内存管理的重要性**...
【标题】中的“安卓SD卡文件管理更新信息相关-安卓微盘Java实现服务器Android端作为客户端全套代码.rar”提到了几个关键概念,分别是安卓SD卡文件管理、更新信息、安卓微盘、Java实现的服务器以及Android客户端。...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
在Java编程中,比较版本号是一项常见的任务,特别是在处理客户端软件更新或依赖管理时。版本号通常由一系列数字和(可选的)字母组成,例如`1.3.20.8`或`6.82.20160101`,甚至包含字母后缀如`8.5c`。直接使用字符串...
可以使用函数(方法)来封装不同功能,如生成随机数、处理用户输入、判断大小等,使代码更易于理解和维护。 总之,这个JAVA猜数字游戏展示了JAVA的基本语法、控制流、输入/输出、随机数生成以及条件判断等核心概念...
### Java实现文件下载功能 在IT领域,尤其是Web开发中,文件下载是常见的需求之一,例如用户可能需要从服务器下载各种类型的文件,如文档、图片、压缩包等。本文将详细解析如何使用Java来实现这一功能,特别是针对...
本项目提供了完整的源代码,大小仅为94.1KB,旨在展示如何利用Java技术来构建一个简单而实用的网络应用。下面我们将深入探讨该项目中的关键知识点。 1. **Java基础**: - **面向对象编程**:五子棋游戏是基于对象...
本项目是基于Java实现的五子棋游戏,它允许用户进行红黑对垒,通过棋盘交叉线计算来判断胜负,下面我们将深入探讨这个项目的相关知识点。 首先,我们要理解Java的基础架构。Java是一种面向对象的编程语言,其设计...
本场景中,我们关注的是使用Java服务器(通常为Java Servlet)接收Android客户端上传的文件。以下是对整个过程的详细解释: **Android客户端上传文件** 1. **创建HTTP请求**:Android客户端首先需要构建一个HTTP...
- `wuziqiFinalServer.java`:这应该是服务器端的实现,负责处理客户端的连接请求,维护多个客户端之间的同步,以及游戏状态的管理。它可能使用了Java的Socket编程来建立客户端与服务器之间的通信通道。 2. **...
### Java实现文件下载并解决中文文件名乱码 在日常的Web开发中,经常会遇到需要让用户下载文件的需求,尤其是在企业级应用中。然而,在实际操作过程中可能会遇到一个常见问题:当文件名包含中文字符时,下载后的...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
本文将详细介绍 Java 实现简单扫码登录功能的实现过程,包括生成二维码、循环请求服务端、判断是否被扫、超时失效功能、登录成功后产生 sessionId 传到页面使用 js 保存 cookie 等步骤。 生成二维码 在生成二维码...
HBase是一款分布式、高性能、基于列族的NoSQL数据库,主要设计用于...以上就是针对“hbase的java客户端api操作示例代码”的主要知识点。通过这些示例,开发者可以更好地理解和实践如何在Java环境中与HBase进行交互。
在这个游戏应用中,Servlet将接收用户的输入(猜测的数字),判断大小,并给出反馈。 描述中的"利用session完成设计"意味着我们需要使用HttpSession接口来存储用户的状态信息。在游戏过程中,服务器需要记住用户的...
### Java判断题知识点详解 #### 1. JSP 包含指令 (`<jsp:include>`) **知识点**: `<jsp:include>` 指令在 JSP 文件中的作用是在编译时将其他 JSP 文件的内容合并到当前 JSP 文件中。 **解析**: 正确。`...