代码:比较两个版本大小

目录 技术

最近项目需要写段代码来做版本的比较,需求大致是:
版本号一般是四位,如 1.0.0.10p7(也可能会少几位),要求比较版本的 先后/大小 关系从而进行一些处理。

刚开始觉得是一个非常常用的功能,应该在很多地方都有现成实现的。但是找了一些开源的项目以后,都没有找到合适的。

像 Maven 里面是也有关于版本判断的代码,但是过于复杂,有好多个类。而我是想最好能有一个函数,把两个版本传进去,告诉我比较的结果就好了。

找不到,于是自己写了个,能满足我的要求了。

	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 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;
	}

2 条评论

  • Ven
    十二月 6, 2009

    看到标题第一反应就是PHP的version_compare()函数,直接比较两个版本号,即使有beta、alpha、rc这种的也不在话下。

  • dandan
    十二月 8, 2009

    在 Java 里面我是没有找到现成可用的函数可以拿来用的。 PHP 的 version_compare() 没有看过,看来也可以参考下 PHP 的实现。

发表评论

电子邮件地址不会被公开。 必填项已用*标注