【问题标题】:What is natural ordering and how to use Comparable [duplicate]什么是自然排序以及如何使用 Comparable [重复]
【发布时间】:2019-10-09 08:18:58
【问题描述】:

当我们使用Comparable 接口定义对象的自然顺序时,自然顺序到底意味着什么?

在我实现了Comparable 接口之后,我怎样才能使用已经被排序的对象呢?接口是如何使用的以及用于什么目的?

【问题讨论】:

  • 当排序方法的文档中说对象将按照自然顺序排序时,这意味着它们将按照您选择的任何compareTo方法(实现Comparable接口)来表示.
  • 在我看来,链接的线程不是重复的。它只解释了 50% 的问题,即自然排序的含义。但不是Comparable 的工作方式、实现方式、使用方式以及它实现的目的。

标签: java sorting comparable


【解决方案1】:

当您自己实现接口时,“自然顺序”就是您在compareTo() 方法中实现的。然后,在对可比较对象的集合进行排序时,此排序将是默认排序顺序。

此接口对实现它的每个类的对象进行总排序。这种排序称为类的自然排序

来自Comparable docs

【讨论】:

    【解决方案2】:

    Comparable 接口的compareTo 方法可用于对作为实现此接口的类的实例的对象列表和数组进行排序。这种排序称为该类的自然排序。

    "实现 Comparable 接口的对象的列表(和数组) 可以通过 Collections.sort(和 Arrays.sort)自动排序。 实现此接口的对象可以用作排序中的键 映射或作为排序集中的元素,无需指定 比较器。”

    来自:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Comparable.html

    【讨论】:

      【解决方案3】:

      说明

      您必须通过实现 compareTo 方法来定义此顺序,该方法在您实现 Comparable 时强制执行。

      这种顺序应该是人类对这种类型的所谓自然。例如,对于整数 (1, 2, 5, 9) 按值递增,对于 Persons 可能按年龄递增。作为设计师,您可以选择用户会觉得自然且不会混淆您的自定义类的东西。

      然后,如果您对这种类型的集合进行排序,它将被用作默认排序。

      参见Comparable 及其Comparable#compareTo 方法的文档:

      此接口对实现它的每个类的对象进行总排序。这种排序称为类的自然排序,类的compareTo 方法称为其自然比较方法

      实现此接口的对象列表(和数组)可以按Collections.sort(和Arrays.sort)自动排序。实现此接口的对象可以用作排序映射中的键或排序集中的元素,而无需指定比较器。


      示例

      这是一个小例子:

      public class Person implements Comparable<Person> {
          private final String name;
          private final int age;
      
          // Constructor, getters, ...
      
          @Override
          public int compareTo(Person other) {
              // Compare based on age, ascending
              return Integer.compareTo(age, other.age);
          }
      }
      

      用法如下:

      Person first = new Person("John", 20);
      Person second = new Person("Jane", 18);
      Person third = new Person("Bob", 30);
      
      List<Person> persons = new ArrayList<>();
      persons.add(first);
      persons.add(second);
      persons.add(third);
      
      // Ordering is now: John, Jane, Bob
      
      // Sort based on natural ordering
      Collections.sort(persons);
      
      // Ordering is now: Jane, John, Bob
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-18
        • 1970-01-01
        • 2017-09-29
        • 2019-06-08
        • 2011-07-07
        相关资源
        最近更新 更多