我对如何实现比较器/可比较有点困惑。我正在尝试对列表进行排序(当前是一个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方法(即使在网上阅读之后),一个简单的解释也会很棒。
答案 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;
}