南京中山东路长满“眼”
2009年12月12日
1 条评论
公司班车22:00到达了南京安德门地铁站。
地铁至新街口德基广场出站,的哥蛮不情愿搭我们上车。
一路聊下来终于发现内因:原来中山东路长满眼了,电眼反应速度之快,稍不留神就会被抓罚上¥200。
ps:七天连锁环境、管理还算满意。
公司班车22:00到达了南京安德门地铁站。
地铁至新街口德基广场出站,的哥蛮不情愿搭我们上车。
一路聊下来终于发现内因:原来中山东路长满眼了,电眼反应速度之快,稍不留神就会被抓罚上¥200。
ps:七天连锁环境、管理还算满意。
最近项目需要写段代码来做版本的比较,需求大致是:
版本号一般是四位,如 1.0.0.10p7(也可能会少几位),要求比较版本的 先后/大小 关系从而进行一些处理。
刚开始觉得是一个非常常用的功能,应该在很多地方都有现成实现的。但是找了一些开源的项目以后,都没有找到合适的。
像 Maven 里面是也有关于版本判断的代码,但是过于复杂,有好多个类。而我是想最好能有一个函数,把两个版本传进去,告诉我比较的结果就好了。
找不到,于是自己写了个,能满足我的要求了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | private static final Pattern PATTERN_DIGI_VERSION = Pattern.compile("([\\d\\.]+)([abp]\\d+)?"); ... /** * Compare two version strings, such as 1.0.0.10p7 and 1.0.0.20 * * @param lv, the left version string to be compared * @param rv, the right version string to be compared * @return, 1 if lv>rv; 0 if lv==rv; -1 if lv<rv */ public static int compareVersion( String lv, String rv ) { String[] lvs = lv.split("\\."); String[] rvs = rv.split("\\."); int lmin = Math.min(lvs.length, rvs.length); for ( int i=0; i<lmin; i++ ) { Matcher lmatch = PATTERN_DIGI_VERSION.matcher(lvs[i]); Matcher rmatch = PATTERN_DIGI_VERSION.matcher(rvs[i]); if ( lmatch.matches() ) { int lv1 = Integer.valueOf(lmatch.group(1)); String strlv2 = lmatch.group(2); if ( rmatch.matches() ) { int rv1 = Integer.valueOf(rmatch.group(1)); String strrv2 = rmatch.group(2); if ( lv1 > rv1 ) return 1; else if ( lv1 < rv1 ) return -1; else { // compare to minor version, such a, b, p1, p3, etc. if ( strlv2 == null || strlv2.length()==0 ) { if ( strrv2 != null && strrv2.length() !=0 ) return -1; } else { if ( strrv2 == null || strrv2.length() == 0 ) return 1; else { String wlv = strlv2.substring(0, 1); int lv2 = strlv2 == null ? -1 : Integer.valueOf(strlv2.substring(1)); String wrv = strrv2.substring(0, 1); int rv2 = strrv2 == null ? -1 : Integer.valueOf(strrv2.substring(1)); // compare small version string first, such as 'a', 'b', 'p' if ( wlv.compareTo(wrv) > 0 ) return 1; else if ( wlv.compareTo(wrv) < 0 ) return -1; else { if ( lv2 > rv2 ) return 1; else if ( lv2 < rv2 ) return -1; } } } } } else { return 1; } } else { return -1; } } if ( lmin < lvs.length ) return 1; else if ( lmin == lvs.length && lmin == rvs.length ) return 0; else return -1; } |