是否有用于比较版本号的标准习惯用法?我不能只使用直接的 String compareTo,因为我还不知道最大释放点数是多少。我需要比较版本并满足以下条件:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
原文由 Bill the Lizard 发布,翻译遵循 CC BY-SA 4.0 许可协议
是否有用于比较版本号的标准习惯用法?我不能只使用直接的 String compareTo,因为我还不知道最大释放点数是多少。我需要比较版本并满足以下条件:
1.0 < 1.1
1.0.1 < 1.1
1.9 < 1.10
原文由 Bill the Lizard 发布,翻译遵循 CC BY-SA 4.0 许可协议
这篇旧帖子的另一个解决方案(对于那些可能有帮助的人):
public class Version implements Comparable<Version> {
private String version;
public final String get() {
return this.version;
}
public Version(String version) {
if(version == null)
throw new IllegalArgumentException("Version can not be null");
if(!version.matches("[0-9]+(\\.[0-9]+)*"))
throw new IllegalArgumentException("Invalid version format");
this.version = version;
}
@Override public int compareTo(Version that) {
if(that == null)
return 1;
String[] thisParts = this.get().split("\\.");
String[] thatParts = that.get().split("\\.");
int length = Math.max(thisParts.length, thatParts.length);
for(int i = 0; i < length; i++) {
int thisPart = i < thisParts.length ?
Integer.parseInt(thisParts[i]) : 0;
int thatPart = i < thatParts.length ?
Integer.parseInt(thatParts[i]) : 0;
if(thisPart < thatPart)
return -1;
if(thisPart > thatPart)
return 1;
}
return 0;
}
@Override public boolean equals(Object that) {
if(this == that)
return true;
if(that == null)
return false;
if(this.getClass() != that.getClass())
return false;
return this.compareTo((Version) that) == 0;
}
}
Version a = new Version("1.1");
Version b = new Version("1.1.1");
a.compareTo(b) // return -1 (a<b)
a.equals(b) // return false
Version a = new Version("2.0");
Version b = new Version("1.9.9");
a.compareTo(b) // return 1 (a>b)
a.equals(b) // return false
Version a = new Version("1.0");
Version b = new Version("1");
a.compareTo(b) // return 0 (a=b)
a.equals(b) // return true
Version a = new Version("1");
Version b = null;
a.compareTo(b) // return 1 (a>b)
a.equals(b) // return false
List<Version> versions = new ArrayList<Version>();
versions.add(new Version("2"));
versions.add(new Version("1.0.5"));
versions.add(new Version("1.01.0"));
versions.add(new Version("1.00.1"));
Collections.min(versions).get() // return min version
Collections.max(versions).get() // return max version
// WARNING
Version a = new Version("2.06");
Version b = new Version("2.060");
a.equals(b) // return false
编辑:
@daiscog:感谢您的评论,这段代码是为 Android 平台开发的,并且按照 Google 的建议,方法“匹配”检查整个字符串,这与使用监管模式的 Java 不同。 ( Android 文档- JAVA 文档)
原文由 alex 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
用点作为分隔符标记字符串,然后从左边开始并排比较整数翻译。