了解用于不同场景的一段代码

时间:2014-07-18 14:02:40

标签: java sorting

有人可以解释这段代码的工作原理:

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

由于我遇到了数字格式异常,因此无效。我相信我只是不明白代码的作用。

1 个答案:

答案 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();
相关问题