由于移动客户端系统、版本碎片化,因此很多后端业务不可避免的要对版本兼容做处理,每一个发布的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之类的方法; 这需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用: ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...
Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...
java的声音处理,介绍java中如何处理声音,包括实现响铃,播放wav,au等音频文件,以及控制声音的大小和音量,Beep.java; 媒体播放器,JMFMediaPlayer.java; 12反射 是java程序开发的特征之一,允许java程序对自身...
65. 什么是java序列化,如何实现java序列化? 48 65.1. java序列化、反序列化 48 65.2. 对象的序列化主要有两种用途: 48 65.3. 对象序列化包括如下步骤: 49 65.4. 对象反序列化的步骤如下: 49 66. 反射机制 49 ...
主要包括了下载和安装APK、检查Apk更新、显示’已经是最新’或者’无法获取版本信息’对话框、获取当前客户端版本信息、显示版本更新通知对话框、显示下载对话框、判断是否挂载了SD卡、显示文件大小格式:2个小数点...
7.Java多态的实现(继承、重载、覆盖) 8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能...
1.JVM:对难以理解的东西产生恐惧... 客户端环境面临着有规律的OutOfMemoryError错误并且对业务造成了很大的影响。 你的开发团队要在如此大的压力下去解决这个问题,通常会怎么做? 用谷歌搜索引擎找到类似的问题
可直接运行,包含jar文件,struts2 图片上传,图片大小,图片格式的限制,客户端文件类型判断等
实例81 按字母顺序比较大小 110 实例82 首尾相连 111 实例83 字符串间的比较 112 实例84 字符集的解码方法 113 实例85 寻找指定字符第一次出现的位置 114 实例86 寻找指定字符最后出现的位置 ...
实例285 Echo服务的客户端是如何实现的? 556 实例286 检测本机的服务端口 558 实例287 下载的页面不丢失链接 559 实例288 如何对网页进行重新定向 560 实例289 在Internet上搜索对象 560 实例290 LAN使用代理服务器...
74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...
74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。 51 75、描述一下JVM加载class文件的原理机制? 52 76、heap和stack有什么区别。 52 77、GC是什么? 为什么要有GC? 52 78、垃圾回收的...