我有一个使用Comparator的自定义表格,用于按列对项目进行排序。我想将某些项目“固定”在顶部,而不考虑当前的排序方式(asc / desc)。除了像往常一样比较的“正常”项目( C ),我还有一个特殊项目( A )必须始终位于表格顶部和N个“收藏夹”项目( B ),它们必须在 A 之后且在 C < / em> ,它们的顺序并不重要(但我也尝试根据它们的数值对它们进行“分类”)。
这里是无论当前排序如何,我的表的外观的表示形式(仅对 C 项进行排序):
A (always present on top)
B (isFavorite)
B (isFavorite)
C (these items are sorted normally)
C
...
C
这是我的比较器,无法正常工作。有时 A 在 B 之后,或者我什至得到Comparator violates general contract
例外。
private class CustomOrderAwareComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
// isA() is always true only for one item
if(o1.isA() && o2.isA())
return 0;
else if(o1.isA())
return table.getSortedOrder() == DESCENDING ? 1 : -1;
// isB() can be true for multiple items
if(o1.isB() && o2.isB()))
return 0;
else if(o1.isB())
return table.getSortedOrder() == DESCENDING ? 1 : -1;
return o1.getValue().compareTo(o2.getValue());
}
}
对于我在这里缺少的内容,我将不胜感激。谢谢!
答案 0 :(得分:1)
我认为在else if (o1.isA()) return...
之后,您还需要else if (o2.isA()) return table.getSortedOrder() == DESCENDING ? -1 : 1;
。对B
执行相同的操作。否则,某些As和某些B可能会落入getValue()
检查中。
这可能会解决一般合同违规问题,但是您可能需要更新equals
方法以匹配compare
的行为。