版本号比较

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