如何根据对象的变量之一对对象列表进行排序
我需要对最佳评分为差的电影ArrayList进行排序(5个最佳-1个最差)。我正在使用Collections.sort(),但列表出来是一样的。我在做什么错如何根据对象的变量之一对对象列表进行排序
films.add(new Film().setRating(1));
films.add(new Film().setRating(2.5));
films.add(new Film().setRating(3.5));
films.add(new Film().setRating(4));
films.add(new Film().setRating(5));
films.add(new Film().setRating(1));
films.add(new Film().setRating(2));
films.add(new Film().setRating(3));
films.add(new Film().setRating(4));
Collections.sort(films, new Comparator<Film>() {
@Override
public int compare(Film o1, Film o2) {
final double film1 = o1.getRating();
final double film2 = o2.getRating();
return film1 > film2? 1
: film1 < film2? -1 : 0;
}
});
使用Double.compare
法正常工作:
public static void main(String[] args) throws IOException, ClassNotFoundException {
final List<Film> films = new ArrayList<>();
films.add(new Film().setRating(1));
films.add(new Film().setRating(2.5));
films.add(new Film().setRating(3.5));
films.add(new Film().setRating(4));
films.add(new Film().setRating(5));
films.add(new Film().setRating(1));
films.add(new Film().setRating(2));
films.add(new Film().setRating(3));
films.add(new Film().setRating(4));
System.out.println(films);
Collections.sort(films, new Comparator<Film>() {
@Override
public int compare(Film o1, Film o2) {
return Double.compare(o1.getRating(), o2.getRating());
}
});
System.out.println(films);
}
输出:
[1.0, 2.5, 3.5, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0]
[1.0, 1.0, 2.0, 2.5, 3.0, 3.5, 4.0, 4.0, 5.0]
的Film
我用:
private static final class Film {
double rating;
public double getRating() {
return rating;
}
public Film setRating(double rating) {
this.rating = rating;
return this;
}
@Override
public String toString() {
return Double.toString(rating);
}
}
我会建议使用Double.compare
,而不是您的版本,甚至o1.getRating - o2.getRating
。
这是要么或你的Film
实现是错误的 - 也许你的例子中的setter没有设置任何东西?
OP的比较没有任何问题。 (为什么会这样呢?当然''适用于Java中的'双打','='可能因为epsilon问题而成片状,但不会导致OP看到的行为。)你的答案改变(并因此修复)没有。 – millimoose 2013-04-06 12:39:17
@ user521180这是如何解决您的问题? – dantuch 2013-04-06 13:24:50
使用如下因素法Double
代替:
public static int compare(double d1, double d2){}
或像这样:
class Film implements Comparable<Film>{
double rating;
@Override
public int compareTo(Film o) {
return Double.compare(rating, o.rating);
}
}
那么我该如何使用该方法? – code511788465541441 2013-04-06 12:42:15
Collections.sort(电影)确定 – BlackJoker 2013-04-06 13:35:39
你的代码工作就好了我的电脑上,执行以下操作:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortFilms {
public static void main(final String ... args) {
new SortFilms().sort();
}
public void sort() {
final List<Film> films = new ArrayList<Film>();
films.add(new Film(1));
films.add(new Film(2.5));
films.add(new Film(3.5));
films.add(new Film(4));
films.add(new Film(5));
films.add(new Film(1));
films.add(new Film(2));
films.add(new Film(3));
films.add(new Film(4));
Collections.sort(films, new Comparator<Film>() {
@Override
public int compare(Film o1, Film o2) {
final double film1 = o1.getRating();
final double film2 = o2.getRating();
return film1 > film2? 1
: film1 < film2? -1 : 0;
}
});
System.out.println(films);
}
private class Film {
private final double rating;
public Film(double rating) {
this.rating = rating;
}
public String toString() {
return "" + rating;
}
public Double getRating() {
return rating;
}
}
}
Procudes:
[1.0, 1.0, 2.0, 2.5, 3.0, 3.5, 4.0, 4.0, 5.0]
侧面说明:你真的需要双精度保持收视率? – dantuch 2013-04-06 12:34:14
电影的具体类是什么? “ ”比较器也可以用来控制某些数据结构的顺序(例如排序集合或排序映射)“ – 2013-04-06 12:35:09
@dantuch可能不是 – code511788465541441 2013-04-06 12:35:47