Comparable类的compareTo方法如何为对象工作

时间:2014-03-24 10:55:33

标签: java sorting arraylist comparable

假设我有一个包含以下实例变量的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如何排序?

3 个答案:

答案 0 :(得分:2)

查看当你执行int x = 5,y = 10时,我们现在可以将它们比作x<y, we can compare two variables, but how do we compare two objects ??

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

您必须为compareTo()方法提供实现,此条件将决定哪个对象大于另一个。

例如,让我们说一部电影应该根据电影中的my 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&lt;平方米。
  • 如果我们得到正数,则m1&gt; m2
  • 如果我们得到零,那么m1 == m2

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

答案 1 :(得分:1)

您必须自己实施Comparable界面和compareTo()方法 ,以便使用对象属性进行比较(例如标题,年份等)< / p>

  

int compareTo(T o)

     

将此对象与指定的订单对象进行比较。返回一个   负整数,零或正整数,因为此对象较少   比,等于或大于指定的对象。

请注意与关联性等相关的各种警告。

我认为你自己写的那种,作为一种练习。您可以使用实现QuickSort的Collections.sort(),此方法允许使用可选的Comparator对象,它允许您实现不同的比较(例如,您可以按名称,按演员姓名,按发布日期等进行排序。通过在不同的比较器中代替)

答案 2 :(得分:0)

实施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);