【问题标题】:Why can't we use only comparable in every situation?为什么我们不能在每种情况下都只使用可比较的?
【发布时间】:2014-09-12 04:47:09
【问题描述】:

可能重复

When should a class be Comparable and/or Comparator?

我了解此链接中给出的区别。
而且在我所指的书中,当我们需要根据多个字段对对象进行排序时,我们不能使用可比性。

我的问题:

我只是想要一个示例,我们不可能使用可比较并且必须使用比较器才能进行比较,并且还请说明为什么我们不能在对象的两个不同字段上进行比较。 如果您发现此问题重复,请提供链接,我搜索了很多问题,但没有一个我想要的示例。

【问题讨论】:

  • Comparator 通常适用于比较广泛的对象,例如排序甚至过滤,并且并非所有对象都实现ComparableComparable 是实例绑定的,您可能想要更改默认 compare 方法的工作方式,Comparator 可以让这更简单......但这只是我
  • 你总是可以让一个类 Comparable 而不是创建一个 Comparator——你是对的。 Comparable 更具限制性,因为 (a) 您必须控制类(即您不能从依赖项 Comparable 中创建类),并且 (b) 每个类只能实现一次 Comparable。
  • 另外,我不知道书中的措辞是什么,但你绝对可以实现Comparable,这样你就可以根据多个字段进行排序。你不能做的是让它以不止一种方式排序。也就是说,您可以说“总是按姓氏排序,然后是名字”,但不能在一种情况下说“按姓氏排序”,而在另一种情况下说“按名字排序”。为此,您需要Comparator
  • 正如我所提到的,在 cay S horstman 中,当我们必须基于多个字段比较对象时,我们不能使用可比较性。请提供一个代码来探索这个。
  • @yshavit 正如您在第二条评论中提到的那样,这是本书的确切措辞。请举例说明如果使用可比性以及比较器如何解决我们的问题,我们实际上会卡在哪里。跨度>

标签: java comparator comparable


【解决方案1】:

如果一个类实现了Comparable,这定义了通常被认为是它元素的自然顺序。在某些情况下,这是唯一可能有意义的排序,在其他情况下,它可能是最广泛使用的排序。如果您以数字为例,可能只有一个(总)排序是有意义的(除了可能取反)。正如其他人已经指出的那样,它们是具有其他有用排序的其他对象。主排序(或者是否有主排序)取决于您的应用程序。如果您在应用程序中管理具有地址的人员,则电话簿排序顺序可以被认为是自然顺序,如果这是最广泛使用的顺序,而按年龄排序可能是次要的。有点 OT:当心不相等的对象被认为与排序相等的情况,这可能会产生像 OrderedList 等容器的问题。

【讨论】:

    【解决方案2】:

    将苹果相互比较将得出相同的苹果类别,如红色苹果、绿色苹果、新旧苹果。只要您只对相当广泛的平等感兴趣,那就可以了。但是,如果您将收到薪水,您会很高兴您在平等级别中可以识别。 所以 compareto 有利于排序和聚类,而 equals/hashcode 是用来识别的。

    【讨论】:

      【解决方案3】:

      Comparable 主要用于存在“已知”默认排序顺序且我们排序的对象或类可编辑或归进行更改的开发人员所有时使用。

      Comparator 适用于所订购的类或对象不属于开发人员的情况,从而像 Web 服务响应一样进行更改。当自然排序不符合需要完成的目标时,它也是首选。

      【讨论】:

        猜你喜欢
        • 2019-06-13
        • 2021-12-30
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-21
        相关资源
        最近更新 更多