最近公司项目上遇到一个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