使用比较器对 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
这是我的比较器,它不能正常工作。有时 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());
}
}
对于我在这里遗漏的任何信息,我将不胜感激。谢谢!
我想 else if (o1.isA()) return...
之后你还需要 else if (o2.isA()) return table.getSortedOrder() == DESCENDING ? -1 : 1;
。为 B
做同样的事情。否则一些 A 和一些 B 可能会通过 getValue()
检查。
这可能会解决一般的合同违规问题,但您可能需要更新您的 equals
方法以匹配 compare
的行为。
我有一个自定义 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
这是我的比较器,它不能正常工作。有时 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());
}
}
对于我在这里遗漏的任何信息,我将不胜感激。谢谢!
我想 else if (o1.isA()) return...
之后你还需要 else if (o2.isA()) return table.getSortedOrder() == DESCENDING ? -1 : 1;
。为 B
做同样的事情。否则一些 A 和一些 B 可能会通过 getValue()
检查。
这可能会解决一般的合同违规问题,但您可能需要更新您的 equals
方法以匹配 compare
的行为。