4

Here is my problem, I have a LinkedList of objects, which have a String name and an int score value.

Now, I need to sort this list in descending order based on the score value.

How do I do that? I tried with Collections.sort(List), but that doesn't work with objects.

How do I tell Java to use the score as the value to comparison?

8
  • Do you mean you have a LinkedHashMap? LinkedList doesn't have K, V pairs. Commented Oct 17, 2015 at 18:33
  • 1
    Collections.sort has a version where you can pass comparator. docs.oracle.com/javase/7/docs/api/java/util/… Commented Oct 17, 2015 at 18:34
  • I don't (?) This will be my first time sorting a List, as previously I was using Arrays, so I'm a newbe. Highschool senior, if that gives any reference how much I know about Java Commented Oct 17, 2015 at 18:37
  • Make sure you understand the distinction between List, Map and Set. What you described is a Map, which contains a Key (String name) and a corresponding Value (int score). Commented Oct 17, 2015 at 18:38
  • @Siddhartha IMO he understand it he has something like LinkedList<TeamDescription> where TeamDescription is a class with String and int Commented Oct 17, 2015 at 18:39

3 Answers 3

9

The Collections.sort method accepts a comparator as its second argument. You can pass in a comparator that defines the ordering that you want. For example given a Person class:

class Person {
    private final String name;
    private final int score;

    Person(String name, int score) {
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}

You can use Collections.sort with a custom comparator to sort Persons by descending order of score like this:

List<Person> list = new LinkedList<>(Arrays.asList(new Person("Jack", 3), new Person("Mike", 9)));

System.out.println("before: " + list);

Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o2.score - o1.score;
    }
});

System.out.println("after: " + list);

This will output:

before: [Person{name='Jack', score=3}, Person{name='Mike', score=9}]
after: [Person{name='Mike', score=9}, Person{name='Jack', score=3}]
Sign up to request clarification or add additional context in comments.

Comments

3

Along with other answers, here is a neat Java 8 solution:

Collections.sort(list, Comparator.comparingInt(obj -> obj.score).reversed());

The reversed() is for descending order, and this compares by obj.score.

As noted by Iaune, obj -> obj.score can be replaced by ObjType::getScore if you are using Encapsulation correctly.

3 Comments

Perhaps either obj.getScore() or WhateverTheClassIsCalled::getScore, assuming that the fields aren't public - they shouldn't be ;-). +1 for this neat definition.
@Downvoter, please leave a comment explaining the issue with my answer so I can fix it.
Not me, but see my comment.
0

Collections.sort(List) works for Objects as long as Objects are comparable to one another either through java.lang.Comparable or java.util.Comparator.Since your Objects need custom sorting,you need to implement a comparator

Collections.sort(list,new Comparator(){
    @Override
    public int compare(MyObject obj1,MyObject obj2){
        return obj2.score - obj1.score;
    }
});

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.