具有空值的比较器

新手上路,请多包涵

我们有一些代码可以根据坐标之间的距离对地址列表进行排序。这是通过带有自定义比较器的 collections.sort 完成的。

然而,有时列表中没有坐标的地址会导致 NullPointerException。我最初解决这个问题的想法是让比较器返回 0 作为至少一个坐标为空的地址的距离。我担心这可能会导致列表中“有效”元素的顺序损坏。

那么在比较器中为空数据返回“0”值是否正常,或者是否有更简洁的方法来解决这个问题?

原文由 pvgoddijn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 564
2 个回答

处理它就像 null 意味着无限远。因此:

  • comp(1234, null) == -1
  • comp(null, null) == 0
  • comp(null, 1234) == 1

这样,您就可以获得一致的排序。

原文由 Sjoerd 发布,翻译遵循 CC BY-SA 3.0 许可协议

只是为了扩展 Willi Schönborn 的回答,我来这里是想说 google-collections 正是您想要的。

一般情况下,你可以自己写 Comparator 来忽略空值(假设非空,这样可以专注于重要的逻辑),然后使用 Ordering 来处理空值:

 Collections.sort(addresses, Ordering.from(new AddressComparator()).nullsLast());

但是,在您的情况下,它是用于排序的地址(坐标)内的数据,对吗? google-collections 在这种情况下 更有 用。所以你可能有更像的东西:

 // Seems verbose at first glance, but you'll probably find yourself reusing
// this a lot and it will pay off quickly.
private static final Function<Address, Coordinates> ADDRESS_TO_COORDINATES =
  new Function<Address, Coordinates>() {
      public Coordinates apply(Address in) {
          return in.getCoordinates();
      }
  };

private static final Comparator<Coordinates> COORDINATE_SORTER = .... // existing

然后当你想排序时:

 Collections.sort(addresses,
    Ordering.from(COORDINATE_SORTER)
            .nullsLast()
            .onResultOf(ADDRESS_TO_COORDINATES));

这就是 google 收藏的力量真正开始发挥作用的地方。

原文由 Cowan 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题