我需要对最佳评价最差的电影(最好的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;
}
});
答案 0 :(得分:5)
使用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可能没有设置任何内容吗?
答案 1 :(得分:2)
使用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);
}
}
答案 2 :(得分:1)
您的代码在我的计算机上运行正常,如下:
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]
答案 3 :(得分:0)
有两种方法可以解决此问题
在Collections.sort方法的第二个参数中实现比较器接口的比较方法。
确保您的类实现Comparable接口,然后实现compareTo方法。
这是这两种解决方案的代码。
request_mem_region()
public class ComparableTest implements Comparable < ComparableTest > {
String name;
int marks;
@Override
public int compareTo(ComparableTest o) {
if (this.marks > o.marks)
return 1;
return -1;
}
public ComparableTest(String name, int marks) {
this.name = name;
this.marks = marks;
}
public String getName() {
return name;
}
public int getMarks() {
return marks;
}
}