1
73
像这样处理
有了这个,你就能得到一个一致的顺序。 |
2
22
只是为了进一步说明威利·施伯恩的答案,我来这里是想说 google-collections 正是你想要的。
一般来说,你可以自己写
不过,在你的例子中,用来排序的是地址(坐标)内的数据,对吧?谷歌收藏甚至 更多 在这种情况下很有用。所以你可能会有更像:
然后,当您要排序时:
这就是谷歌收藏的力量真正开始发挥作用的地方。 |
3
8
我的看法是你想做的任何事
根据我的经验,npe bug的感染通常是由以下不良的编码习惯引起的:
(更好的解决“无价值”问题的方法通常包括重写代码,这样您就不会 需要 表示此值和/或使用非空值;例如空字符串、特殊实例、保留值。你不可能总能找到更好的解决方案,但你通常可以。) 如果这描述了您的应用程序,那么您应该花时间根除代码问题,而不是想办法隐藏npe。 |
4
8
我的解决方案(可能对这里的人有用)是做比较正常,用空值代替不是0,而是可能的最大值(例如integer.max_value)。如果值本身为0,则返回0不一致。下面是一个正确的例子:
我只是想补充一下,你不需要整数的最大值。这取决于giveMesomeEase()方法可以返回什么。例如,如果比较摄氏度作为天气,则可以将l和r设置为-300或+300,具体取决于要将空对象设置为列表的头或尾。 |
5
3
你可能不想返回0,因为这意味着地址是等距的,你真的不知道。这是一个非常典型的问题,您试图处理错误的输入数据。我不认为比较器的责任是试图确定地址的实际距离,当你 不知道 距离。我会在排序之前把这些地址从列表中删除。 黑客会把它们移到列表的底部(但这很难看!) |
6
2
如果使用Java 8,则在比较器类中有2个新的静态方法,这是很有用的:
比较将是空安全的,您可以选择将空值放在排序序列中的位置。 以下示例:
将打印: [空][空][[黑猩猩][香蕉][吃][跑][睡][笑][扔香蕉皮] |
7
1
与其把这看作是比较器的技术问题,不如再看一下需求:您在这里真正想做的是什么,您打算如何处理这个排序列表?
正如您已经意识到的,当其中一个值为空时总是返回0在这里不是一个好主意;它确实会破坏结果。但是你应该做什么取决于你需要什么,而不是其他人通常做什么/需要什么。程序如何处理没有位置的地址(用户将看到什么)不应该取决于一些技术细节,比如比较器的“最佳实践”是什么。 (对我来说,问这里的“最佳实践”是什么,听起来就像问“最佳要求”是什么)。 |
8
1
不,没有更干净的方法。也许:
但更重要的是-试着去掉/填充缺少的坐标,或者,更好的做法是:不要在列表中添加缺少坐标的地址。 实际上,不把它们放在列表中是最合乎逻辑的行为。如果你把它们放在列表中,结果实际上不会按距离排序。 您可以创建另一个列表,其中包含缺少坐标的地址,并向需要该信息的人(最终用户、api用户)表明,第一个列表仅包含具有所需数据的地址,而第二个列表包含缺少所需信息的地址。 |
9
1
我个人不喜欢在我的比较器中处理任何特殊的空情况,所以我一直在寻找一个更干净的解决方案,最终找到了谷歌的收藏。他们点的菜太棒了。它们支持复合比较器,提供从零到上到尾的排序,并允许在比较之前运行某些函数。编写比较器从来没有这么容易过。你应该试一试。 |
Dave · 按集合属性的大小比较对象,空集保留在排序列表的末尾 6 年前 |
ssl · Java按名称对对象进行排序,但一个对象应始终位于顶部 7 年前 |
sakh1979 · Clojure:如何使用与集合/联合比较[重复] 7 年前 |
Joe · 在python中比较mysql结果值未采用 7 年前 |
John Casey · 比较两个圆形物体 7 年前 |
PentiumPro200 · C++向量迭代器N\u元素编译错误 7 年前 |
Shubham Pathak · 基于地图索引表的值比较 8 年前 |