自定义比较器未正确排序

时间:2018-05-21 07:36:23

标签: java android sorting

我在自定义对象上创建了一个自定义比较器。

我想要的是按照这些规则对项目进行排序:

  1. 我的有序列表中的第一项应该是ID == null的原始列表项(我确定每个列表只有一个或没有,)
  2. 我的有序列表中的第二项应该是带有ID == emptyUUID的原始列表项(一个空的UUID,所以全0;我也确定每个列表只有一个或没有,要排序)
  3. 其余项目将填写按CODE
  4. 排序的列表

    这就是我的尝试:

    @Override
    public int compareTo(Component f) {
        if (getID() == null) {
            return -1;
        }
        if (getID().equals(RuntimeHelper.emptyUUIDString)) {
            return -1;
        }
        if (getCODE() == null || getCODE().isEmpty()) {
            return -1;
        } else if (f.getCODE() == null || f.getCODE().isEmpty()) {
            return 1;
        }
        return getCODE().compareToIgnoreCase(f.getCODE());
    }
    

    但我得到的是:

    • 1st - >按CODE
    • 排序的一些对象列表
    • 第二 - >在列表中间我的对象ID == null / emptyUUID
    • 3rd - >其他项目按CODE
    • 排序

    我错过了什么?

    解决方案,感谢Henry和Stephen

    我知道它仍然是原始的,但它确实有效,很快就会让它看起来更好

    @Override
    public int compareTo(Component f) {
        if (f.getID() == null && getID() == null) {
            return 0;
        }
        if (getID() == null) {
            return -1;
        }
        if (f.getID() == null) {
            return 1;
        }
        if (f.getID().equals(getID())) {
            return 0;
        }
        if (getID().equals(RuntimeHelper.emptyUUIDString)) {
            return -1;
        }
        if (f.getID().equals(RuntimeHelper.emptyUUIDString)) {
            return 1;
        }
        if (getCODE() == null || getCODE().isEmpty()) {
            return -1;
        }
        if (f.getCODE() == null || f.getCODE().isEmpty()) {
            return 1;
        }
        return getCODE().compareToIgnoreCase(f.getCODE());
    }
    

1 个答案:

答案 0 :(得分:3)

以下是一些问题:

if (getID() == null) {
    return -1;
}

如果f.getID()也是null,则上述内容违反了合同。此外,如果f.getID()nullthis.getUID()null,那么此时您应该返回+1

if (getID().equals(RuntimeHelper.emptyUUIDString)) {
    return -1;
}

与之前案例类似的缺陷。

if (getCODE() == null || getCODE().isEmpty()) {
    return -1;
} else if (f.getCODE() == null || f.getCODE().isEmpty()) {
    return 1;
}

与前一种情况类似的缺陷......当两个代码为空或空时。

以上各种违反了这些不变量中的一个或两个:

    所有compare(a, a) == 0
  • a != null
  • compare(a, b) == -1< =>所有compare(b, a) == +1a != null
  • 均为b != null