使用比较器对 table 进行排序,其中 "pins" 项位于顶部

Sort table using Comparator which "pins" items at top

我有一个自定义 table 使用比较器按列对项目进行排序。我想 "pin" 某些项目置顶,而不考虑当前排序 (asc/desc)。除了"normal"项(C),我还有一个特殊项(A ) 必须始终位于 table 和 N "favorite" 项 (B) 的顶部,它必须在 A 之后和 C 之前并且它们的顺序并不重要(但我也尝试过"subsorting" 他们基于他们的数值)。

这是我的 table 无论当前排序如何(仅 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());
    }
}

对于我在这里遗漏的任何信息,我将不胜感激。谢谢!

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

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