我在自定义对象上创建了一个自定义比较器。
我想要的是按照这些规则对项目进行排序:
ID == null
的原始列表项(我确定每个列表只有一个或没有,)ID == emptyUUID
的原始列表项(一个空的UUID,所以全0;我也确定每个列表只有一个或没有,要排序)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());
}
但我得到的是:
CODE
ID == null / emptyUUID
CODE
我错过了什么?
我知道它仍然是原始的,但它确实有效,很快就会让它看起来更好
@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());
}
答案 0 :(得分:3)
以下是一些问题:
if (getID() == null) {
return -1;
}
如果f.getID()
也是null
,则上述内容违反了合同。此外,如果f.getID()
为null
和this.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) == +1
和a != null
b != null