在 Java 中比较版本字符串的有效方法
可能的重复:
你如何比较Java中的两个版本字符串?
我有2个字符串,其中包含版本信息,如下所示:
str1 = "1.2"
str2 = "1.1.2"
现在,任何人都可以告诉我在Java中的字符串中比较这些版本的有效方法,如果它们相等,则返回0,如果它们相等,则返回-1,如果str1<str2和1(如果str1>str2)。
可能的重复:
你如何比较Java中的两个版本字符串?
我有2个字符串,其中包含版本信息,如下所示:
str1 = "1.2"
str2 = "1.1.2"
现在,任何人都可以告诉我在Java中的字符串中比较这些版本的有效方法,如果它们相等,则返回0,如果它们相等,则返回-1,如果str1<str2和1(如果str1>str2)。
字符串操作需要 commons-lang3-3.8.1.jar。
/**
* Compares two version strings.
*
* Use this instead of String.compareTo() for a non-lexicographical
* comparison that works for version strings. e.g. "1.10".compareTo("1.6").
*
* @param v1 a string of alpha numerals separated by decimal points.
* @param v2 a string of alpha numerals separated by decimal points.
* @return The result is 1 if v1 is greater than v2.
* The result is 2 if v2 is greater than v1.
* The result is -1 if the version format is unrecognized.
* The result is zero if the strings are equal.
*/
public int VersionCompare(String v1,String v2)
{
int v1Len=StringUtils.countMatches(v1,".");
int v2Len=StringUtils.countMatches(v2,".");
if(v1Len!=v2Len)
{
int count=Math.abs(v1Len-v2Len);
if(v1Len>v2Len)
for(int i=1;i<=count;i++)
v2+=".0";
else
for(int i=1;i<=count;i++)
v1+=".0";
}
if(v1.equals(v2))
return 0;
String[] v1Str=StringUtils.split(v1, ".");
String[] v2Str=StringUtils.split(v2, ".");
for(int i=0;i<v1Str.length;i++)
{
String str1="",str2="";
for (char c : v1Str[i].toCharArray()) {
if(Character.isLetter(c))
{
int u=c-'a'+1;
if(u<10)
str1+=String.valueOf("0"+u);
else
str1+=String.valueOf(u);
}
else
str1+=String.valueOf(c);
}
for (char c : v2Str[i].toCharArray()) {
if(Character.isLetter(c))
{
int u=c-'a'+1;
if(u<10)
str2+=String.valueOf("0"+u);
else
str2+=String.valueOf(u);
}
else
str2+=String.valueOf(c);
}
v1Str[i]="1"+str1;
v2Str[i]="1"+str2;
int num1=Integer.parseInt(v1Str[i]);
int num2=Integer.parseInt(v2Str[i]);
if(num1!=num2)
{
if(num1>num2)
return 1;
else
return 2;
}
}
return -1;
}
正如其他人所指出的那样,String.split()是一种非常简单的方法来进行比较,Mike Deck提出了一个很好的观点,即对于这样(可能)的短字符串,它可能并不重要,但是嘿!如果要在不手动解析字符串的情况下进行比较,并且可以选择提前退出,则可以尝试java.util.Scanner类。
public static int versionCompare(String str1, String str2) {
try ( Scanner s1 = new Scanner(str1);
Scanner s2 = new Scanner(str2);) {
s1.useDelimiter("\\.");
s2.useDelimiter("\\.");
while (s1.hasNextInt() && s2.hasNextInt()) {
int v1 = s1.nextInt();
int v2 = s2.nextInt();
if (v1 < v2) {
return -1;
} else if (v1 > v2) {
return 1;
}
}
if (s1.hasNextInt() && s1.nextInt() != 0)
return 1; //str1 has an additional lower-level version number
if (s2.hasNextInt() && s2.nextInt() != 0)
return -1; //str2 has an additional lower-level version
return 0;
} // end of try-with-resources
}