Sorting
Soring based on simple fields are easy to do when it comes to Jave 8. But sorting based on Objects inside a list of Objects needs attention
// Sort method under Collection takes the same comparator
list.sort(Comparator.comparing(String::toString, (String a, String b) -> Integer.parseInt(a.substring(2)) - Integer.parseInt(b.substring(2))));
list.sort(Comparator.comparing(String::toString,comparator.reversed()));
// Single Line Implementation using Collections Arrays Utility Class
Collections.sort(list, ((String a, String b) -> Integer.parseInt(a.substring(2)) - Integer.parseInt(b.substring(2))));
Comparator<String> comparator = (String a, String b) -> Integer.parseInt(a.substring(2)) - Integer.parseInt(b.substring(2));
Collections.sort(list, comparator);
list.sort(comparator);
View Class Structure
View Sample Data
If we have a list of EventComments and the sort is based on the following
criterion :-
- if we wish to compare based on one arbitrary field
indexinside SomeClass object
eventCommentsList.sort((object1, object2) -> {
return object1.getSomeClass().getIndex().compareTo(object2.getSomeClass().getIndex());
});
- if the requirement is to compare (reversed sort) based on a field
timeDtDisplayin the value of first element of the list ObjectList<SomeStats> someStats.
Notice the placement of the object2 in comparison to object1 for reverse sorting.
eventCommentsList.sort((object1, object2) -> {
return object2.getSomeStats().get(0).getTimeDtDisplay().compareTo(object1.getSomeStats().get(0).getTimeDtDisplay());
});
- if the requirement is to compare based on some field
indexofSomeClassObject and if theindexis equal, then use the fieldtimeDtDisplayfrom the first element of the List ofSomeStats
eventCommentsList.sort(
(EventComments o1, EventComments o2) -> {
if(o1.getSomeClass().getIndex() > o2.getSomeClass().getIndex())
return -1;
else if(o1.getSomeClass().getIndex() < o2.getSomeClass().getIndex())
return 1;
else {
return (o2.getSomeStats().get(0).getTimeDtDisplay().compareTo(o1.getSomeStats().get(0).getTimeDtDisplay()));
}
});
Please notice that the code has been reduced from this longer version, where the Comparator interface is being implemented the older way.
eventCommentsList.sort(new Comparator<EventComments>() {
@Override
public int compare(EventComments o1, EventComments o2) {
if(o1.getSomeClass().getIndex() > o2.getSomeClass().getIndex())
return -1;
else if(o1.getSomeClass().getIndex() < o2.getSomeClass().getIndex())
return 1;
else {
return (o2.getSomeStats().get(0).getTimeDtDisplay().compareTo(o1.getSomeStats().get(0).getTimeDtDisplay()));
}
}
});