【问题标题】:How does compareTo method of Comparable class work for objectsComparable 类的 compareTo 方法如何对对象起作用
【发布时间】:2014-05-01 16:34:57
【问题描述】:

假设我有一个包含以下实例变量的 Movie 类:

private String myTitle; // title of Bond film
private String myBondActor; // name of actor who portrayed James Bond
private int myYear; // year film was released
private double myFilmRating;// from all-reviews.com
private int myLengthHours; // hours (truncated) portion of film length
private int myLengthMinutes;// minutes beyond truncated hours

我有一个ArrayListMovie 对象,我使用冒泡排序算法对ArrayList 进行排序:

public void bubbleSort(ArrayList<Movie> list) {
for (int outer = 0; outer < list.size() - 1; outer++) {
    for (int inner = 0; inner < list.size() - outer - 1; inner++) {
        if (list.get(inner).compareTo(list.get(inner + 1)) > 0) {
            Movie temp = list.get(inner);
            list.set(inner, list.get(inner + 1));
            list.set(inner + 1, temp);
        }
    }
}

ArrayList 是如何排序的?

【问题讨论】:

    标签: java sorting arraylist comparable


    【解决方案1】:

    您必须实现Comparable 接口和compareTo() 方法您自己,这样您就可以使用您的对象属性(例如标题、年份等)进行比较

    int compareTo(T o)

    将此对象与指定对象进行比较以进行排序。返回一个 负整数、零或正整数,因为此对象较小 大于、等于或大于指定的对象。

    请注意与关联性等相关的各种注意事项。

    我假设您正在自己编写排序,作为练习。你可以使用Collections.sort(),它实现了快速排序,并且这个方法允许一个可选的Comparator对象,它允许你实现不同的比较(例如,你可以按名称、演员姓名、发布日期等排序。通过替换不同的比较器)

    【讨论】:

      【解决方案2】:

      实现Comparable接口:

      class Movie implements Comparable 
      {
          private String myTitle; 
          private String myBondActor; 
          private int myYear; 
          private double myFilmRating;
          private int myLengthHours; 
          private int myLengthMinutes;
      
          // Override CompareTo Method
          public int compareTo ( Movie m )
          {
               // Here comparison logic
          }
      }
      

      现在只需像这样调用方法:

      Collections.sort(list);
      

      【讨论】:

        【解决方案3】:

        看看你什么时候做 int x= 5,y=10 我们现在可以像x&lt;y, we can compare two variables, but how do we compare two objects ??那样比较它们

        我们通过 compareTo() 比较对象,您的 Movie 类必须实现 Comparable 接口才能将其对象相互比较。

        您必须提供 compareTo() 方法的实现,这个标准将决定哪个对象大于另一个。

        例如,假设电影应该根据电影的 int myYear(发行年份) 进行排序(比较),因此实现将是

        public int compareTo(Movie other)
        {
           return this.myYear - other.getMyYear();
        }
        

        现在我们创建两个 Movie 类型的对象 m1 和 m2,其中 m1.myYear=2000 和 m2.myYear=2001

        当我们做m1.compareTo(m2);

        • 我们得到 2000 - 2001 = -1... 一个负数,表示 m1
        • 如果我们得到一个正数,那么 m1 > m2
        • 如果我们得到一个零,那么 m1 ==m2

        在这里,我根据 myYear 来决定哪个 Movie 对象比另一个更大,您可能会决定其他的东西,也许更多的条件。 无论条件如何,记住您返回的数字 +ve 、 -ve 或 0(零)将决定哪个对象大于另一个。