有人可以解释这段代码的工作原理:
enum MyStringComparator implements Comparator<String> {
INSTANCE;
@Override
public int compare(String s1, String s2) {
int n1 = Integer.parseInt(s1.split("\\.")[2]);
int n2 = Integer.parseInt(s2.split("\\.")[2]);
return Integer.compare(n1, n2);
}
}
我正在尝试排序
"7.0.x",
"14.0.x",
"13.0.x-version_4",
所以根据我的理解,我想在x处拆分,看看之前是什么?
因此我尝试了以下内容:
enum MyStringComparator implements Comparator<String> {
INSTANCE;
@Override
public int compare(String s1, String s2) {
int n1 = Integer.parseInt(s1.split("\\.\\.x")[5]);
int n2 = Integer.parseInt(s2.split("\\.\\.x")[5]);
return Integer.compare(n1, n2);
}
}
由于我遇到了数字格式异常,因此无效。我相信我只是不明白代码的作用。
答案 0 :(得分:1)
第一段代码在按点分割后查看每个字符串的第三个分量,然后将它们转换为整数,并进行比较。
但是,在你的情况下,由于第三个组件是x
,这不是一个数字,这不会起作用。如果您想比较前两个组件,则必须执行以下操作:
String[] parts1 = s1.split("\\.");
String[] parts2 = s2.split("\\.");
int comparison = Integer.compare(Integer.parseInt(parts1[0]), Integer.parseInt(parts2[0]));
if (comparison == 0) {
comparison = Integer.compare(Integer.parseInt(parts1[1]), Integer.parseInt(parts2[1]));
}
return comparison;
如果您正在使用Guava,请执行以下操作:
String[] parts1 = s1.split("\\.");
String[] parts2 = s2.split("\\.");
return ComparisonChain.start()
.compare(Integer.parseInt(parts1[0]), Integer.parseInt(parts2[0]))
.compare(Integer.parseInt(parts1[1]), Integer.parseInt(parts2[1]))
.result();