按int字段的降序排序列表,然后按字典顺序排列int字段是否相等

时间:2014-04-09 08:13:01

标签: java sorting comparator comparable

我对如何实现比较器/可比较有点困惑。我正在尝试对列表进行排序(当前是一个ArrayList,但这可以改变...),当调用Collections.Sort时,它的对象按特定的整数字段按降序排序,如果是整数字段等于名称字段的字典顺序。

这是我的目标:

class Movie implements Comparator<Movie>, Comparable<Movie> {
public String _title;
public int _time;

public Movie(String title, int time) {
    this._title = title;
    this._time = time;
}

public Movie() {

}

@Override
public int compareTo(Movie o) {
    return (this._title.compareTo(o._title));
}

@Override
public int compare(Movie arg0, Movie arg1) {
    return (arg0._time > arg1._time) ? -1 : (arg0._time == arg1._time) ? 0 : 1;
}
}

目前它只通过数字字段进行排序。如果数字字段相等,我如何通过字典顺序对其进行排序?

我对compareTo方法感到有些困惑。这定义了自然顺序吧?那是什么

 (this._title.compareTo(o._title))
实际上呢? 非常感谢你的帮助!

编辑:

我通过在compare方法中添加if语句并返回&#34; arg0.compareTo(arg1)&#34;来获得我想要的输出。但是我仍然不确定compareTo方法(即使在网上阅读之后),一个简单的解释也会很棒。

2 个答案:

答案 0 :(得分:1)

  

我对compareTo方法感到有些困惑。这定义了   自然秩序吧?那是什么

     

(this._title.compareTo(o._title))

     

实际上呢?

字符串的自然顺序是它们的字典顺序。

尝试:

if (arg0._time > arg1._time){
   return -1
} else if (arg0._time < arg1._time){
   return 1;
} else {
   return arg0._title.compareTo(arg1._title);
}

答案 1 :(得分:0)

您可以使用以下模式来定义具有越来越多特定条件的compareTo

@Override
public int compareTo(Movie other) {
    int result = Integer.compare( this._time, other._time );

    if (result == 0) {
        result = this._title.compareTo( other._title );
    }

    if (result == 0) {
        // result = compare even more specific field
    }

    return result;
}