首页 > 解决方案 > 自定义比较器未正确排序

问题描述

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

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

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

这是我尝试过的:

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

但我得到的是:

我错过了什么?

解决方案,感谢 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());
}

标签: javaandroidsorting

解决方案


这里有一些问题:

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

以上违反合同如果f.getID()是也null。此外,如果f.getID()是NOT ,null那么此时您应该返回 +1this.getUID()null

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) == +1为所有a != nullb != null

推荐阅读