最近公司项目上遇到一个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
分享到:
相关推荐
比较版本号算法,适用于大多数版本号比较。比较实用的一个工具类
标题中的“版本号(多个小数点数字)高低对比”是指在软件开发中常见的版本号比较问题。在IT行业中,版本号通常用于标识软件的不同迭代阶段,它由一系列的数字和点组成,如1.0.0、1.2.3等。在处理这些版本号时,我们...
在系统中需要版本管理时,比较系统或系统文件版本号的大小的通用函数,java实现。比如从以下数组中找出版本号最大的: public static void main(String[] args) { String[] versions = new String[]{"17.2.3", ...
在Java编程中,版本号比较是一项常见的任务,特别是在软件开发和依赖管理中。这个主题主要涉及到如何使用Java代码处理字符串形式的版本号,并进行有效的比较。以下是对这一知识点的详细阐述。 首先,版本号通常由一...
版本号 (version number)语义化版本号比较模块。语义化版本号通常定义如下:Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]主版本号 .子版本号 [.修正版本号 [.编译版本号 ]]使用var ...
3. **比较版本号**:比较版本号通常涉及将字符串形式的版本号转换为整数数组,例如,"1.2.3.4"转换为[1, 2, 3, 4]。然后,逐元素比较数组,直到找到不相等的元素,或者所有元素都相等,表明版本相同或不同。 4. **...
涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法; 这需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用: ...
因此,一个能够高效准确地进行版本号比较的工具类就显得尤为重要。 #### 二、核心功能介绍 在给定的代码示例中,`NumUtils` 类提供了 `compareVersion` 方法用于实现版本号的比较功能。该方法接收两个字符串参数 `...
比较版本号的大小的通用函数,java实现。支持包涵字符串型版本号
在nsis打包脚本中使用的版本信息检测函数,简单,实用
在Java编程中,比较版本号是一项常见的任务,特别是在处理客户端软件更新或依赖管理时。版本号通常由一系列数字和(可选的)字母组成,例如`1.3.20.8`或`6.82.20160101`,甚至包含字母后缀如`8.5c`。直接使用字符串...
你可以根据实际需要调整或扩展这个功能,例如记录到日志文件、比较版本号或触发其他操作。 通过这样的程序,你的朋友就能有效地管理和监控他所测试的软件组件的版本情况,确保使用的都是最新的或兼容的版本。同时,...
- `compareTo()`: 比较两个版本号的大小。 - `increment()`: 更新版本号(如增加修订号)。 4. **文件版本信息** 在Windows系统中,每个可执行文件或动态链接库(DLL)都有一个文件版本信息,可以通过`...
3. **版本号比较**:比较两个版本号并确定其相对大小。 接下来,我们将详细介绍如何通过Python实现以上功能。 #### 三、实现细节 ##### 1. 版本号格式验证 为了确保输入的版本号格式正确,我们采用正则表达式来...
这部分信息主要用于区分同一版本的不同构建,但不影响版本号的比较。例如 `1.0.0-alpha+001`。 #### 5. 规范的重要性 在软件开发过程中,版本控制是一项至关重要的任务。随着软件系统的日益复杂,依赖管理成为一大...
在实际应用中,这个库可以帮助开发者轻松地进行版本号比较,例如: ```java Version version1 = new Version("1.2.3"); Version version2 = new Version("1.2.4"); if (version1.compare(version2) ) { // 版本1...
4. **文件版本号对比**:对于具有版本信息的文件(如DLL或EXE),我们可以使用`FileVersionInfo`类获取文件的版本号。这需要比较`FileVersionInfo.FileMajorPart`、`FileVersionInfo.FileMinorPart`、`...
chrome 49版本号 比较老的chrome版本,使用与一些测试人员的研究