Sorting custom class array-list string using Collections.sort

10,396

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));
     }
});
Share:
10,396
Adil Bhatty
Author by

Adil Bhatty

droid guy

Updated on August 25, 2022

Comments

  • Adil Bhatty
    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
    Paul Bellora about 12 years
    Might want to cite Adam's comment.
  • Mark Pazon
    Mark Pazon about 12 years
    Didn't see that it has been answered already in the comments. Editing... Thanks!