使用比较器对表格进行排序,该比较器“固定”在顶部

时间:2019-03-05 22:55:26

标签: java logic comparator

我有一个使用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());
    }
}

对于我在这里缺少的内容,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为在else if (o1.isA()) return...之后,您还需要else if (o2.isA()) return table.getSortedOrder() == DESCENDING ? -1 : 1;。对B执行相同的操作。否则,某些As和某些B可能会落入getValue()检查中。

这可能会解决一般合同违规问题,但是您可能需要更新equals方法以匹配compare的行为。