snippetjavaCritical
Sort ArrayList of custom Objects by property
Viewed 0 times
propertysortobjectsarraylistcustom
Problem
I read about sorting ArrayLists using a Comparator but in all of the examples people used
I wanted to sort an ArrayList of custom objects by one of their properties: a Date object
(
compareTo which according to some research is a method for Strings.I wanted to sort an ArrayList of custom objects by one of their properties: a Date object
(
getStartDay()). Normally I compare them by item1.getStartDate().before(item2.getStartDate()) so I was wondering whether I could write something like:public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}Solution
Since
So your custom
The
Your sorting code would be just about like you wrote:
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:
Since java-8
You can now write the last example in a shorter form by using a lambda expression for the
And
This is such a common idiom that there's a built-in method to generate a
All of these are equivalent forms.
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 {
@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() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});Since java-8
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.
Code Snippets
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}Collections.sort(Database.arrayList, new CustomComparator());Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));Context
Stack Overflow Q#2784514, score: 1737
Revisions (0)
No revisions yet.