Skip to content

Comparable and Comparator

Anthony Christe edited this page Nov 13, 2013 · 1 revision

Comparable

Comparable Example
public class Person implements Comparable<Person> {
  private String name;

  ...

  public String getName() {
    return this.name;
  }
  
  ...

  @Override
  public int compareTo(Person o) {
    return this.name.compareTo(o.getName());
  }
}
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("Bob"));
persons.add(new Person("Alice"));
persons.add(new Person("Susie"));
persons.add(new Person("Dave"));

Collections.sort(persons);
System.out.println(persons);
// ["Alice", "Bob", "Dave", "Susie"]

Comparator

Sorting Strings by Length
  • Natural ordering by alphabetical order
  • Need a comparator to sort differently
List<String> strings = new ArrayList<String>();
strings.add("aaaa");
strings.add("a");
strings.add("aaa");
strings.add("aa");

Collections.sort(strings, new LengthComparator());

System.out.println(strings);
// ["a", "aa", "aaa", "aaaa"]
public class LengthComparator implements Comparator<String> {
  @Override
  public int compare(String o1, String o2) {
    if(o1.length < 02.length) {
      return -1;
    }
    if(o1.length == o2.length) {
      return 0;
    }
    return 1;
  }
}
  • Can we use built in compareTo for Strings? Yes we can.
public class LengthComparator implements Comparator<String> {
  @Override
  public int compare(String o1, String o2) {
    return ((Integer) o1.length()).compareTo((Integer) o2.length());
  }
}
  • We don't need to create another file, we can use anonymous classes as well
List<String> strings = new ArrayList<String>();
strings.add("aaaa");
strings.add("a");
strings.add("aaa");
strings.add("aa");

Collections.sort(strings, new Comparator<Meep>() {
  @Override
  public int compare(Meep o1, Meep o2) {
    return ((Integer) o1.length()).compareTo((Integer) o2.length());
  }
});

In-Lab

Clone this wiki locally