当前位置: 首页 > 面试题库 >

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

夹谷浩博
2023-03-14
问题内容

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

副手:

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

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


问题答案:

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



 类似资料:
  • 问题内容: 我正在编写一个将学校表连接到地区表的SQL查询。每个学校都隶属于一个地区的简单一对多关系。我的查询如下: 我之所以加入左派,是因为并非每所学校都隶属于一个地区。例如,一所学校可能是在家上学的,其中可能包含所有在家上学的学生。那不会在一个地区。 所以我想做的是使用ORDER BY来按地区名称排序,然后按学校名称排序。唯一的问题是,我希望空区位于底部,以便可以在输出末尾使用名为“其他”的组

  • 上一章介绍了很多排序算法, 插入排序、选择排序、 归并排序等等,这些算法都属于 内部排序算法,即排序的整个过程只是在内存中完成。而当待排序的文件比内存的可使用容量还大时,文件无法一次性放到内存中进行排序,需要借助于外部存储器(例如硬盘、U盘、光盘),这时就需要用到本章介绍的 外部排序算法来解决。 外部排序算法由两个阶段构成: 按照内存大小,将大文件分成若干长度为 l 的子文件(l 应小于内存的可使

  • null field2和field3为空的所有字段 所有field2为空、field3为值的字段 所有field3为空、field2为值的字段 到目前为止,我已经使用了三个与UNION连接的查询 我自己觉得这是很多必要的代码来得到它的秩序,并希望有一个更好的解决方案。 那么有没有更好的办法呢?

  • 问题内容: 我有以下HTML格式,将给定元素放在桌面顶部和移动设备底部(宽度<640像素)的有效方法是什么?由于存在许多不同的设备,因此我不想编写位置坐标,因为页面高度的内容会有所不同。有什么建议么? 问题答案: 使用Flexbox最好以响应方式对未知高度的元素进行重新排序。虽然对桌面浏览器的支持不是很好(IE是此处的主要限制因素,但支持从v10开始),但大多数移动浏览器 都 支持。 请注意,Fl

  • 问题内容: 我可以阅读 MySQL 文档,这很清楚。但是,如何决定要使用哪个字符集?整理对哪些数据有影响? 我要求对两者以及如何选择它们进行解释。 问题答案: 从MySQL 文档: 甲 字符集 是一组符号和编码。甲 归类 为在一个字符集的字符进行比较的一组规则。让我们通过一个假想字符集的例子来清楚地区分。 假设我们有一个包含四个字母的字母:“ A”,“ B”,“ a”,“ b”。我们给每个字母一个

  • 当我们在debian机器中使用g编译下面的代码时,会生成以下错误。。。有人能帮我解释一下为什么会出现错误吗?我试着注释排序行,然后出现错误,但是我们的任务需要排序,那么可能的解决方案是什么 代码: 输出: 在/usr/include/c/4.7/algorithm:63:0中包含的文件中,来自testvect。cpp:3:/usr/include/c/4.7/bits/stl\u algo。h: