Sort ArrayList of custom Objects by property Sort ArrayList of custom Objects by property java java

Sort ArrayList of custom Objects by property


Since Date implements Comparable, it has a compareTo method just like String does.

So your custom Comparator could look like this:

public class CustomComparator implements Comparator<MyObject> {    @Override    public int compare(MyObject o1, MyObject o2) {        return o1.getStartDate().compareTo(o2.getStartDate());    }}

The compare() method must return an int, so you couldn't directly return a boolean like you were planning to anyway.

Your sorting code would be just about like you wrote:

Collections.sort(Database.arrayList, new CustomComparator());

A slightly shorter way to write all this, if you don't need to reuse your comparator, is to write it as an inline anonymous class:

Collections.sort(Database.arrayList, new Comparator<MyObject>() {    @Override    public int compare(MyObject o1, MyObject o2) {        return o1.getStartDate().compareTo(o2.getStartDate());    }});

Since

You can now write the last example in a shorter form by using a lambda expression for the Comparator:

Collections.sort(Database.arrayList,                         (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

And List has a sort(Comparator) method, so you can shorten this even further:

Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

This is such a common idiom that there's a built-in method to generate a Comparator for a class with a Comparable key:

Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));

All of these are equivalent forms.


Classes that has a natural sort order (a class Number, as an example) should implement the Comparable interface, whilst classes that has no natural sort order (a class Chair, as an example) should be provided with a Comparator (or an anonymous Comparator class).

Two examples:

public class Number implements Comparable<Number> {    private int value;    public Number(int value) { this.value = value; }    public int compareTo(Number anotherInstance) {        return this.value - anotherInstance.value;    }}public class Chair {    private int weight;    private int height;    public Chair(int weight, int height) {        this.weight = weight;        this.height = height;    }    /* Omitting getters and setters */}class ChairWeightComparator implements Comparator<Chair> {    public int compare(Chair chair1, Chair chair2) {        return chair1.getWeight() - chair2.getWeight();    }}class ChairHeightComparator implements Comparator<Chair> {    public int compare(Chair chair1, Chair chair2) {        return chair1.getHeight() - chair2.getHeight();    }}

Usage:

List<Number> numbers = new ArrayList<Number>();...Collections.sort(numbers);List<Chair> chairs = new ArrayList<Chair>();// Sort by weight:Collections.sort(chairs, new ChairWeightComparator());// Sort by height:Collections.sort(chairs, new ChairHeightComparator());// You can also create anonymous comparators;// Sort by color:Collections.sort(chairs, new Comparator<Chair>() {    public int compare(Chair chair1, Chair chair2) {        ...    }});


For sorting an ArrayList you could use the following code snippet:

Collections.sort(studList, new Comparator<Student>(){    public int compare(Student s1, Student s2) {        return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());    }});