Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I sort list of object based on one of the object's variables

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;
    }
});
like image 305
code511788465541441 Avatar asked Apr 06 '13 12:04

code511788465541441


People also ask

How do you sort a list of objects based on an attribute of the objects in Java?

sort() method to sort a list of objects using some examples. By default, the sort() method sorts a given list into ascending order (or natural order). We can use Collections. reverseOrder() method, which returns a Comparator, for reverse sorting.

How do you sort a linked list of objects?

By using the sort(List<T> list) method, it can be sorted in ascending order. If you want to reverse the sorting order, you can simple use sort(List<T> list, Comparator<? super T> c) . The parameter is Collections.


3 Answers

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?

like image 142
Boris the Spider Avatar answered Oct 06 '22 00:10

Boris the Spider


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);
    }
}
like image 24
BlackJoker Avatar answered Oct 06 '22 02:10

BlackJoker


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]
like image 42
Tobb Avatar answered Oct 06 '22 02:10

Tobb