首页 > 解决方案 > 使用比较器对表格进行排序,该比较器将项目“固定”在顶部

问题描述

我有一个使用比较器按列对项目进行排序的自定义表。无论当前排序如何(asc/desc),我都想将某些项目“固定”到顶部。除了像往常一样比较的“正常”项目(C)之外,我还有一个必须始终位于表格顶部的特殊项目( A )和 N 个“最喜欢的”项目( B),必须在A之后和之前C和它们的顺序并不重要(但我也尝试根据它们的数值对它们进行“子排序”)。

无论当前排序是什么,这是我的表应该是什么样子的表示(只有C项应该被排序):

A (always present on top)
B (isFavorite)
B (isFavorite)
C (these items are sorted normally)
C
...
C

这是我的比较器工作不正常。有时AB之后,或者我什至得到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());
    }
}

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

标签: javalogiccomparator

解决方案


我想以后else if (o1.isA()) return...你也需要else if (o2.isA()) return table.getSortedOrder() == DESCENDING ? -1 : 1;。做同样的事情B。否则,一些 A 和一些 B 可能会通过getValue()检查。

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


推荐阅读