【问题标题】:where need to use collections.sort() and comparable and comparator interfaces in java collection?java 集合中哪里需要使用 collections.sort() 以及可比较和比较器接口?
【发布时间】:2013-04-08 22:35:46
【问题描述】:

我通过一些文章对收藏有所了解。
但是我很困惑应该在哪里实现 collections.sort() 方法以及在哪里需要使用可比较的接口(compareTo() 和比较器接口(compare())。

比较这个和另一个参考对象的可比较接口,但比较两个对象的比较器。

我想知道具体哪些情况需要使用方法?

谢谢,

【问题讨论】:

  • 如果一个类具有自然顺序,则使其与实现该顺序的 compareTo 方法具有可比性。排序时,如果要对非 Comparable 数据进行排序,或者需要按 Comparable 类型的自然顺序以外的顺序进行排序,请使用 Comparator。

标签: java collections


【解决方案1】:

你不应该实现Collections.sort();这个方法是built-in to Java。如果是Comparable,则在不提供Comparator 的情况下调用该方法以按自然顺序 进行排序。否则,提供Comparator 以对Comparator 的方式进行排序。

您应该让类实现Comparable 并提供compareTo 方法,如果该类具有自然顺序,如Comparable javadocs 中所示。 IntegerDouble 就是一个例子,它们当然具有自然的数学排序。

当您无法使对象的类对Comparable 进行排序时,或者当您想要呈现一个替代自然排序的排序时,或者当您想要强加没有自然顺序时的顺序。一个例子是颠倒自然顺序(例如,从最大到最小降序排序)。另一个示例是具有多个字段的数据对象,您希望对多个字段进行排序,例如带有firstNamelastNamePerson 对象:您可以有一个Comparator,它首先对lastName 进行排序,另一个对firstName 进行排序。

【讨论】:

    【解决方案2】:

    当我无法访问要比较的类的代码时,比较器对我来说很有意义:例如,您可能需要为 String 实现自定义比较器。

    当我需要对我自己的自定义对象列表进行排序时,我编写它们来实现接口 Comparable。

    【讨论】:

      【解决方案3】:

      让我们看看我是否可以用简单的话来解释:

      compareTo() 方法旨在将对象的 活动 实例与对象的另一个实例进行比较。所以,假设你有这个示例类:

      public class Spam implements Comparable<Spam> {
          private int eggs;
          public Spam(int eggs) {
              this.eggs = eggs;
          }
          public int compareTo(Spam otherSpam) {
              return otherSpam.eggs - this.eggs;
          }
          public int getEggs() {
              return eggs;
          }
      }
      

      假设您在代码中的某处使用了这个 Spam 类:

      ...
      if(spam1.compareTo(spam2) == 0) {
          System.out.println("Both spams are equal");
      } else {
          if(spam1.compareTo(spam2) > 0)
              System.out.println("'spam2' is bigger than 'spam1'");
          else
              System.out.println("'spam2' is smaller than 'spam1'");
      }
      ....
      

      所以,compareTo() 用于判断一个类的两个实例是否相等,如果不相等,则判断哪个更大。

      这对于排序算法的重要性现在是显而易见的。如果您不知道一个对象是否大于另一个对象,您将如何对一组对象进行排序?当调用sort 的实现时,它使用类的compareTo() 方法来决定集合的正确顺序。

      最后,compare() 方法是您想要在类外部 执行比较时使用的方法。一个实现是:

       public int compare(Spam s1, Spam s2) {
           return s1.getEggs() - s2.getEggs();
       }
      

      希望对你有帮助

      【讨论】:

        【解决方案4】:

        我猜 Comparator 仅在您想按升序对类中的对象进行排序时使用。用于按升序对类的 ID 进行排序。基于一个字段的互斥排序自动排除基于另一个字段的排序

        【讨论】:

          猜你喜欢
          • 2018-11-27
          • 1970-01-01
          • 1970-01-01
          • 2016-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多