java - 自定义比较器未正确排序
问题描述
我在我的自定义对象上创建了一个自定义比较器。
我想要的是按照这些规则对我的项目进行排序:
- 我的有序列表中的第一项应该是原始列表项
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());
}
但我得到的是:
- 1st --> 一些对象的列表排序方式
CODE
- 第二个->在列表的中间我的对象
ID == null / emptyUUID
- 第三——>其他项目排序
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());
}
解决方案
这里有一些问题:
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 != null
和b != null
推荐阅读
- tensorflow - 存储整个图
- bash - 根据参数挂钩 bash 自动完成
- python - Python-Selenium:下拉框中的元素不可点击
- r - 在 renderPlot 中找不到 R Shiny Object
- r - R - cat 函数不起作用/总是在 Shiny 中返回 NULL
- objective-c - -[NSObject valueForKey:] 什么时候不能返回 NSObject?
- c# - 服务器端自动建议不过滤值
- angular - Angular 5 - IE 浏览器上的无头测试
- docker - 如何将我的 hybris 项目转换为 docker 镜像
- python - Python - 文件类型问题(列表和字符串)