Sorting custom class array-list string using Collections.sort
Solution 1
Like Adam says, simply do:
Collections.sort(
arrlstContacts,
new Comparator<Contacts>()
{
public int compare(Contacts lhs, Contacts rhs)
{
return lhs.Name.compareTo(rhs.Name);
}
}
);
The method String.compareTo
performs a lexicographical comparison which your original code is negating. For example the strings number1
and number123
when compared would produce -2 and 2 respectively.
By simply returning 1, 0 or -1 there's a chance (as is happening for you) that the merge part of the merge sort used Collections.sort
method is unable to differentiate sufficiently between the strings in the list resulting in a list that isn't alphabetically sorted.
Solution 2
As indicated by Adam, you can use return (lhs.Name.compareTo(rhs.Name));
likeso:
Collections.sort(arrlstContacts, new Comparator<Contacts>() {
public int compare(Contacts lhs, Contacts rhs) {
return (lhs.Name.compareTo(rhs.Name));
}
});
Comments
-
Adil Bhatty over 1 year
I am trying to sort my custom class array-list using Collections.sort by declaring my own anonymous comparator. But the sort is not working as expected.
My code is
Collections.sort(arrlstContacts, new Comparator<Contacts>() { public int compare(Contacts lhs, Contacts rhs) { int result = lhs.Name.compareTo(rhs.Name); if(result > 0) { return 1; } else if (result < 0) { return -1; } else { return 0; } } });
The result is not in sorted order.
-
Paul Bellora about 12 yearsMight want to cite Adam's comment.
-
Mark Pazon about 12 yearsDidn't see that it has been answered already in the comments. Editing... Thanks!