java - 使用比较器对表格进行排序,该比较器将项目“固定”在顶部
问题描述
我有一个使用比较器按列对项目进行排序的自定义表。无论当前排序如何(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
这是我的比较器工作不正常。有时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
.
推荐阅读
- python - Pycharm 安装包失败
- excel - 在excel中动态生成公式
- python - 如何在 PYTHON 中将 Base64 字符串转换为图像
- python - python程序不删除两位数
- c++ - 为什么数组没有在这里打印出来?(c++)
- java - 在 selenium Webdriver 中查找必填字段的标签文本
- reactjs - 删除所有选定的行,即使我在其他页面中使用带有受控分页的 react-table
- javascript - Bootstrap-Vue 开关样式复选框:不显示自定义控件切换
- javascript - 在 React Native 中按下按钮时从 API 重新获取
- sql-server - 在 Tableau prep 中通过 Windows 身份验证连接到 Microsoft SQL Server?