小编典典

不错,将空值排序到底部的通用方法是什么?

java

我正在编写一些自定义比较器,并且希望它们将空项目推到列表的底部,而不管我是对升序还是对降序排序。解决这个问题的最佳策略或模式是什么?

副手:

  • 只需编写单独的升序和降序比较器,并在可能的情况下共享代码
  • 通过抛出NPE或显式调用它来将空处理委托给另一个类
  • 包含升序标志,并在其中放置条件逻辑以在空值周围导航
  • 将常规比较器包装在空处理类中

还有其他策略吗?我想听听使用不同方法的经验,以及各种策略的陷阱。


阅读 218

收藏
2020-11-16

共1个答案

小编典典

最后一个选择对我很有吸引力。比较器非常好地链接在一起。特别是,您可能希望同时编写ReverseComparatorNullWrappingComparator


编辑:您不必自己编写。如果您查看Google收藏库中的Ordering类,您会发现它以及其他各种好东西:)


编辑:进入更多细节以显示我的意思ReverseComparator

一个警告的词-在a的实现中ReverseComparator,颠倒参数的顺序,而不是求反,否则Integer.MIN_VALUE将“颠倒”自身。

所以这个实现是错误的(假设original比较器要反向):

public int compare(T x, T y)
{
    return -original.compare(x, y);
}

但这是正确的:

public int compare(T x, T y)
{
    return original.compare(y, x);
}

原因是,我们总是希望扭转比较,但如果original.compare(x, y)回报率int.MIN_VALUE,那么坏的比较器将
int.MIN_VALUE,这是不正确。这是由于那个有趣的特性int.MIN_VALUE == -int.MIN_VALUE

2020-11-16