Writing Your own Comparator : Comparator Interface « Collections « Java Tutorial






import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

class Employee implements Comparable {
  String department, name;

  public Employee(String department, String name) {
    this.department = department;
    this.name = name;
  }

  public String getDepartment() {
    return department;
  }

  public String getName() {
    return name;
  }

  public String toString() {
    return "[dept=" + department + ",name=" + name + "]";
  }

  public int compareTo(Object obj) {
    Employee emp = (Employee) obj;
    int deptComp = department.compareTo(emp.getDepartment());

    return ((deptComp == 0) ? name.compareTo(emp.getName()) : deptComp);
  }

  public boolean equals(Object obj) {
    if (!(obj instanceof Employee)) {
      return false;
    }
    Employee emp = (Employee) obj;
    return department.equals(emp.getDepartment()) && name.equals(emp.getName());
  }

  public int hashCode() {
    return 31 * department.hashCode() + name.hashCode();
  }
}
class EmpComparator implements Comparator {
  public int compare(Object obj1, Object obj2) {
    Employee emp1 = (Employee)obj1;
    Employee emp2 = (Employee)obj2;

    int nameComp = emp1.getName().compareTo(emp2.getName());

    return ((nameComp == 0) ?
      emp1.getDepartment().compareTo(emp2.getDepartment()) :
      nameComp);
  }
}
public class MainClass {
  public static void main(String args[]) {
    Employee emps[] = { 
        new Employee("Finance", "A"), 
        new Employee("Finance", "B"),
        new Employee("Finance", "C"), 
        new Employee("Engineering", "D"),
        new Employee("Engineering", "E"), 
        new Employee("Engineering", "F"),
        new Employee("Sales", "G"), 
        new Employee("Sales", "H"), 
        new Employee("Support", "I"), };
    Set set = new TreeSet(new EmpComparator());
    set.addAll(Arrays.asList(emps));
    System.out.println(set);
  }
}
[[dept=Finance,name=A], [dept=Finance,name=B], [dept=Finance,name=C], [dept=Engineering,name=D], [dept=Engineering,name=E], [dept=Engineering,name=F], [dept=Sales,name=G], [dept=Sales,name=H], [dept=Support,name=I]]








9.40.Comparator Interface
9.40.1.System-Defined Comparable Classes
9.40.2.Writing Your own Comparator
9.40.3.Getting reverse order comparator
9.40.4.Implementing a Comparator for a class
9.40.5.Use a custom comparator.
9.40.6.Sort an array of strings in reverse order.
9.40.7.Sort an array of strings, ignore case difference.
9.40.8.Use a comparator to sort accounts by last name.
9.40.9.Comparator uses a Collator to determine the proper, case-insensitive lexicographical ordering of two strings.
9.40.10.Calendar Comparator
9.40.11.Invertible Comparator