最近项目需要写段代码来做版本的比较,需求大致是:
版本号一般是四位,如 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;
} |
最近忙家事,这片小花园有段日子没功夫打理了。
今儿20091202过来除个草,浇个水。
自从免费空间在10月除出了问题,等了半个月才恢复之后,在这里码字的热情也一下子淡了很多。再加上接下来的一段时间事情也比较多,所以很久都没有更新文章了。
接下来要准备重新开张了,要坚持啊!
今天不是有意但是欣赏了杭州烟花大会的整个过程,相当的壮观!
2009-10-22, ebnd 在因为免费空间出问题关闭了半个月之后,又“置之死地而后生” 啦!重生纪念。
今天上午在西湖区西溪路608号港昌交通事故处理大厅处理完“9-25小区撞脚事件”。记录下,同样留个纪念。
关于 TDD,总是有很多的争论,说写测试代码浪费时间等等等等。
看到一篇讨论测试代码所花时间的文章,写的很不错,文章后面的回复讨论也很有价值。
从作者的分析,他写测试代码所花费的时间只占整个开发时间的 10% 左右!
尽管关于这个时间比例回复中有不同的看法,但基本上所有的人都认同 TDD 是能带来极大的好处的。
上次包包脚被车撞之后,医生让一周以后去医院复检的。上午约好了跟同一小区肇事的车主一起去医院检查。上次检查的医生今天不在门诊,去病房了,这次检查的医生很年轻,先让拍了片,等拿到片子以后,看了下,说骨头没有骨折,没大问题;问多久能好,说一两个礼拜就好;问有没有什么要注意的,说没有什么要注意的。
小伙看起病是挺干脆麻利的,不过给我的感觉有点过于粗放了。就好比写程序,有些新手,改起代码来大大咧咧很利落的,但是不够谨慎小心考虑周全。这样不出问题也没事,要是出问题就麻烦了。另外之前的两次医生,都没有这么轻描淡写,问国庆回家能不能走动,都说最好不要受力的。
不管怎样,骨头没事是确定的了,看接下来一两周恢复的情况了。
今天杭州天气不好,一直在下雨,下午一点多看外面不下了,出去叫车,结果还是有小雨,后来越下越大,好久才打到车。接下来都还顺利,提前半个多小时就到了车站。人非常多,原本的入口前面摆起来长 S 的队伍,以避免人群以各个方向冲向入口造成混乱;还有警察和部队的士兵,跟五一的时候一样的。应对这种节假日的高峰是有经验了。检票的时候看前面有个人的车票上用订书机订着一张纸条“上车请携带身份证”,有点奇怪,问了才知道是去北京的。
一路上基本都在下雨,而且有的地方下的很大,以为回家也要淋雨要不方便的。直到开过金坛收费口过去一段,发现路面是干的,原来家这边没有下雨的,感觉还不错。虽然原本三个小时的车程开了将近四个小时,总算还是顺利到家了。

以前 bbs 里的一篇老的帖子,现在这里也保留一份。
=========================================
[Q]: 操作系统:Wiondows XP。
现象:窗口开多了以后,经常出现这样的提示: “内存或系统资源不足。请关闭一些窗口或程序,然后再试。”
在Google里面一搜就会找到很多的解释,比如下面的:
http://zhidao.baidu.com/question/9054809.html?fr=qrl3
但是在我的情况中,系统有2G内存,平常使用也就用了1G~1.5G左右,
只是窗口开的比较多,但是内存绝对是够的! 系统没有中毒,也没有安装什么特别的软件。
一个很简单的重现这个问题的办法:
用 “Win键 + E” 不断的打开资源管理器,会发现打开到40多个的时候,就开始出现不正常了。
这个时候报的错误就是:“内存或系统资源不足。请关闭一些窗口或程序,然后再试。”
其实这个时候的内存还是绰绰有余的,是双核+2G的机器。
在这里可以找到一篇文章,提到了GDI泄漏的一个bug,但是安装了该hotfix以后,问题依旧。
http://www.cakewalk.com/Support/kb/kb2005243.asp
[A]:经高人指点,找到了问题的解释和解决方案:
http://weblogs.asp.net/…/max-num-of-open-windows-under-xp-2003-vista-resolved.aspx,
注意 XP SP2 的 SharedSection 已经设成1024,3072,512了,只需要增大第二个数字就可以,另外改注册表以后要重启。
SharedSection 的解释:http://support.microsoft.com/kb/184802/en-us
AdventNet Simulator 是一个模拟 SNMP Agent 的工具,支持常规的 SNMP Get / GetBulk / Set 等操作,对于网管软件的开发很有帮助。用这个工具,可以做到不需要实际的设备,而只需要设备相关的 SNMP mib 文件就可以模拟出一个“真实”的节点设备。在实际的开发过程中,往往网管和设备是同时开始的,在设备开发还没有结束的情况下,网管就可以用模拟器先模拟出一个设备进行基本的集成测试。
这里假定已经在 AdventNet Simulator 里有了一个模拟出的设备了,并且选择的方式是 XML 方式。那如果 mib 文件发生了改动,这个时候通常的做法是先 Stop Agent,然后在左边的 mib 树上选中要更新的 mib,点击 Unload Mib File,之后再重新加载就可以了。但是这样做带来的一个问题是之前配置的所有的数据可能都会丢掉,需要重新配,比较麻烦。
如果改动的 mib 不是很多的话,也可以直接修改 xml 文件来使模拟的设备支持新的 mib 表。
假设<SimulatorDir>是 AdventNet Simulator 的安装目录,<DeviceName>是模拟的设备的名称,新增的表名字叫 NewMibTable。做法如下:
- 进入 <SimulatorDir>/snmpagents/<DeviceName> 目录
- 打开 <DeviceName>_netSimMapping.xml,参考该文件中已有的其他表项,添加新增表的定义。
- 打开 <DeviceName>_netSimRegister.xml,同2,参考文件中已有的其他项,添加新增增表的定义。
- 找一个跟新增的项比较接近的 mib 表,拷贝粘贴重命名,生成 <DeviceName>_NewMibTable.xml,<DeviceName>_NewMibTable1.xml,<DeviceName>_NewMibTable_org.xml,<DeviceName>_NewMibTable1_org.xml,同样修改里面的数据,以适合这个新增表各个字段的类型和数值。
按照上述步骤,做完了之后再重新 Start Agent,然后验证下看这个新增的表格增删改数据有没有问题。如果没有问题,那恭喜你,已经成功了。如果不能增加修改的话怎么办呢?那就耐心点,再检查下上面的一些配置文件是不是都配置的正确,有配的不对的就改掉,应该就好了。
另外,如果想实现其他的一些目的,比如不在模拟器 UI 里面增加数据,而直接修改 XML 文件等等;有了上面的经验,已经也能够想到办法的了。
一大早上班走在小区路上的靠右侧,居然能被左手边后来居上的轿车压到右脚。
有些无辜和不幸,又有些滑稽和荒唐。
接下来就是去同德医院,挂号、拍片、检查,跟车主同交警开事故责任认定书,然后再送回小区,整整一个上午。比较麻烦,因为右脚行动不便,dandan背来背去,背上背下,费了不少劲。但总算还好,人没有大碍,片子检查结果也让人放心,说总体还好,脚后跟处有些看不清楚,让一个礼拜以后再去复查。等伤情稳定之后还要再去西溪路的交警大队进行调解。
刚开始一直无法理解,车轮从脚上过去,脚如何能够承受而且没有大碍(骨折)的。回到家中才发现,原来右脚的鞋已经变形了!也多亏了这双结实的凉鞋,不能真的是很难想象后果会怎样了。网上搜搜,还是可以找到很多的案例的。
真是不幸中的万幸。 2009-09-25 ,逃过一劫。不知道是不是塞翁失马。
在这件事情的过程中,也有很多需要反省吸取教训的地方,处理突发事件还不够成熟果断,比如叫交警、等。
愿大家都平平安安,健康是福!
被压过的凉鞋,还比较硬朗:

