How can I sort list of object based on one of the object's variables
10,812
Solution 1
Using the Double.compare
method works fine:
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);
}
Output:
[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]
The Film
I used:
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);
}
}
I would suggest using Double.compare
rather than your version, or even o1.getRating - o2.getRating
.
It's either that or your Film
implementation is wrong - maybe the setter in your example doesn't set anything?
Solution 2
Use the folowing method in Double
instead:
public static int compare(double d1, double d2){}
or like this:
class Film implements Comparable<Film>{
double rating;
@Override
public int compareTo(Film o) {
return Double.compare(rating, o.rating);
}
}
Solution 3
Your code works just fine on my computer, the following:
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]
Author by
124697
Updated on June 20, 2022Comments
-
124697 almost 2 years
I need to sort an ArrayList of films best rated to worse (5 best - 1 worst). I am using Collections.sort() but the list comes out the same. what am i doing wrong
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; } });
-
Montre about 11 yearsThere's nothing wrong with the OP's comparison. (Why would it be? Surely
<
and>
works fordoubles
in Java.=
might be flaky because of epsilon issues but that wouldn't cause the behaviour the OP is seeing.) Your answer changes (and thus fixes) nothing. -
124697 about 11 yearsHow do I then use that method?
-
BlackJoker about 11 yearsCollections.sort(films) is OK