我正在使用GWT CellTable,如果列包含NULL单元格以及非NULL单元格,则以下代码无法正确排序:
columnSortHandler.setComparator(sixColumn, new Comparator<SectDtlsString>() {
@Override
public int compare(SectDtlsString o1, SectDtlsString o2) {
if (o1 == o2) {
return 0;
}
// Compare the Six columns.
if (o1 != null) {
return (o2 != null) ? o1.getsixPatrol().compareTo(o2.getsixPatrol()) : 1;
}
return -1;
}
});
table.addColumnSortHandler(columnSortHandler);
例如:
黑色,null,null,红色 - 什么都不做。它应该在第一次选择时返回null,null,Black,Red,在第二次选择时返回Red,Black,null,null
黑色,红色,棕色,Tawney - 返回 - 黑色,棕色,红色,Tawney在第一个选择和 - Tawney,红色,棕色,黑色 - 在第二个选择(即没有空值工作)。
我有几乎相同的代码引用不包含NULL的列,它们排序非常好。我从教程中复制了这段代码。
这是建议之后的结果:
// Compare the Six columns.
if (o1 != null) {
if (o1 == o2) {
return 0;
}
if (o1.getsixPatrol() != null) {
if (o1.getsixPatrol() == o2.getsixPatrol()) {
return 0;
}
return o2 != null ? o1.getsixPatrol().compareTo(o2.getsixPatrol()) : 1;
}
}
return -1;
答案 0 :(得分:1)
您的代码中存在两个问题。
首先,null检查位置错误:如果o1为null,则o1 == o2
将通过异常。它应该是:
// Compare the Six columns.
if (o1 != null) {
if (o1 == o2) {
return 0;
}
return o2 != null ? o1.getsixPatrol().compareTo(o2.getsixPatrol()) : 1;
}
其次,检查o1和o2不为空是不够的。在比较之前,您还需要检查o1.getsixPatrol()
和o2.getsixPatrol()
是否为空。