最近公司项目上遇到一个BUG,导出应用版本信息报表获取最新版本时出了问题,发现1.10.0.0和1.5.0.0比较如果在sql中max()比较的话是后者大,所以最后只能把数据取出来。本来是简单的,但是受到其他代码的影响,处理之前和之后数据类型不能改变(List<Map<String, Object>>)
思路如下:
某个设备的的不同用户可以下载安装不同版本的同一个应用,所以要获取这个设备上某个应用的最新版本,首先要把该设备上的这个应用的各版本信息存放到一个List中,把这个设备的唯一标识ID作为key,最后通过迭代key获取List中各版本的信息,对版本好进行比较。
代码如下:
public List<Map<String,Object>> findAppMaxVersion(List<Map<String, public List<Map<String,Object>> findAppMaxVersion(List<Map<String, Object>> applist) {
Map<String, List<Map<String, Object>>> appMap = new HashMap<String, List<Map<String, Object>>>();
List<Map<String, Object>> tmpApps = null;
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
/*将list转换成map*/
for (Map<String, Object> map:applist) {
String id = String.valueOf(map.get("ID"));
if (appMap.containsKey(id)) {
tmpApps = appMap.get(id);
tmpApps.add(map);
} else {
tmpApps = new ArrayList<Map<String,Object>>();
tmpApps.add(map);
appMap.put(String.valueOf(id), tmpApps);
}
}
if (appMap == null || appMap.isEmpty()) {
return null;
}
/*对同一key中List存放的不同版本的版本号进行比较*/
for (String key : appMap.keySet()) {
List<Map<String, Object>> matchedList = appMap.get(key);
Map<String,Object> map = new HashMap<String, Object>();
if (matchedList.isEmpty()) {
continue;
}
map = matchedList.get(0);
if (matchedList.size() > 1) {
for (int i = 0; i < matchedList.size() - 1; i++) {
if (CommonUtils.MaxVersion(map.get("APPVERSION").toString(),
matchedList.get(i + 1).get("APPVERSION").toString())<0) {
map = matchedList.get(i + 1);
}
}
}
list.add(map);
}
return list;
}
}
其中MaxVersion()方法是获取最新版本的方法,代码如下:
public static int MaxVersion(String version1, String version2){
String v1[]=version1.split("\\.");
String v2[]=version2.split("\\.");
for(int i=0, j=0;i<v1.length && j<v2.length; i++,j++){
if(v1[i].length()==v2[j].length()){
if(v1[i].compareTo(v2[j])!=0){
return v1[i].compareTo(v2[j]);
}
}else {
return v1[i].length()-v2[j].length();
}
}
return 0;
}
总结:
本次主要涉及到了list转换成map和序列号的比较,序列号的比较比较简单,关于list转换出map这里提供三种方法:
http://jackyrong.iteye.com/blog/2158009
分享到:
相关推荐
比较版本号算法,适用于大多数版本号比较。比较实用的一个工具类
在系统中需要版本管理时,比较系统或系统文件版本号的大小的通用函数,java实现。比如从以下数组中找出版本号最大的: public static void main(String[] args) { String[] versions = new String[]{"17.2.3", ...
版本号 (version number)语义化版本号比较模块。语义化版本号通常定义如下:Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]主版本号 .子版本号 [.修正版本号 [.编译版本号 ]]使用var ...
涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法; 这需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用: ...
java代码-版本号比较
对不同文件夹里面相同文件名的动态链接库dll提取版本号等信息,并进行对比,生成对比日志文件。
chrome 49版本号 比较老的chrome版本,使用与一些测试人员的研究
版本处理类,提供版本与数字互相转换,方便入库后进行比较筛选 * Func: * public version_to_integer 将版本号转为数字 * public integer_to_version 将数字转为版本号 ... * public compare 比较两个版本号的值
软件项目版本号的命名规则及格式 版本控制比较普遍的 3 种命名格式 : 一、GNU 风格的版本号命名格式 : 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]]
vc每次编译时,自动递增版本号信息 自己再vs2005下试验过,没有问题 使用方法: 将modifyver.exe拷到系统目录下(例如windows下) 在vc的预生成事件中加上“modifyver.exe $(ProjectName).rc” 思路是修改rc文件,用...
配置项的版本号规则与配置项的状态有关。 (1) 处于“草稿”状态的配置项的版本号格式为0.YZ,YZ的数字范围为01~99。随着草稿的修正,YZ的取值应递增。YZ的初值和增幅由用户自己把握。 (2) 处于“正式”状态的...
本篇文章主要介绍了java 中涉及到客户端的系统经常需要用到比较版本号的功能,并附小示例,希望能帮助需要的小伙伴
简单java代码获取apk文件版本号,用于比较判断apk版本更新!
Python比较版本号(csdn)————程序
比较版本号的大小的通用函数,java实现。支持包涵字符串型版本号
相同位置版本号大小比较: def abc(str1, str2): if str1 == or str2 == : print(输入包含空字符串,请重新输入) return (输入包含空字符串,请重新输入) elif str1 == str2: print(2个版本号相同) return (2...
比较版本号.md
一些基本的排序,归并,插入,选择,冒泡,二分查找