Comparator Interface

Implement different sort orders with the Comparator interface’s compare() method, and pass the Comparator as a parameter to List.sort(). Your implementation must explicitly handle null inputs in the compare() method to avoid a null pointer exception.

Namespace

System

Comparator Methods

The following are methods for Comparator.

compare(var1, var2)

Compares the two arguments and returns a negative integer, zero, or a positive integer depending on whether the first argument is less than, equal to, or greater than the second argument.

Signature

public Integer compare(T var1, T var2)

Parameters

var1
Type: T
T - The type determined by the parameterized type of the Comparator. For example, if the class implements Comparator<Account> then var1 and var2 are of type Account .
var2
Type: T
T - The type determined by the parameterized type of the Comparator. For example, if the class implements Comparator<Account> then var1 and var2 are of type Account .

Return Value

Type: Integer

Comparator Example Implementation

Use the Comparator interface to impose different kinds of sorting.

This example implements two different ways of sorting employees.

1public class Employee {
2
3    private Long id;
4    private String name;
5    private Integer yearJoined;
6    
7    // Constructor
8    public Employee(Long i, String n, Integer y) {
9        id = i;
10        name = n;
11        yearJoined = y;
12    }
13    
14    public String getName() { return name; }
15    public Integer getYear() { return yearJoined; }
16}
1// Class to compare Employees by name
2    public class NameCompare implements Comparator<Employee> {
3        public Integer compare(Employee e1, Employee e2) {
4            if(e1?.getName() == null && e2?.getName() == null) {
5                return 0;
6            } else if(e1?.getName() == null) { 
7                return -1; 
8            } else if(e2?.getName() == null) {
9                return 1;
10            }        
11            return e1.getName().compareTo(e2.getName());
12            }
13        }
14
15    // Class to compare Employees by year joined
16    public class YearCompare implements Comparator<Employee> {
17        public Integer compare(Employee e1, Employee e2) {
18            // Guard against null operands for ‘<’ or ‘>’ operators because
19            // they will always return false and produce inconsistent sorting
20            Integer result;
21            if(e1?.getYear() == null && e2?.getYear() == null) {
22                result = 0;
23            } else if(e1?.getYear() == null) { 
24                  result = -1; 
25            } else if(e2?.getYear() == null) {
26                  result = 1;
27            } else if (e1.getYear() < e2.getYear()) {
28                  result = -1;
29            } else if (e1.getYear() > e2.getYear()) {
30                  result = 1;
31            } else {
32                  result = 0;  
33            } 
34        return result;
35        }
36    }
37

The following example tests the implementation:

1@isTest
2private class EmployeeSortingTest {
3    @isTest
4    static void sortWithComparators() {        
5        List<Employee> empList = new List<Employee>();
6        empList.add(new Employee(101,'Joe Smith', 2020));
7        empList.add(new Employee(102,'J. Smith', 2020));
8        empList.add(new Employee(25,'Caragh Smith', 2021));
9        empList.add(new Employee(105,'Mario Ruiz', 2019));
10        // Sort by name
11        NameCompare nameCompare = new NameCompare();
12        empList.sort(nameCompare);
13        // Expected order: Caragh Smith, J. Smith, Joe Smith, Mario Ruiz
14        Assert.areEqual('Caragh Smith', empList.get(0).getName());
15        
16        // Sort by year joined
17        YearCompare yearCompare = new YearCompare();
18        empList.sort(yearCompare);
19        // Expected order: Mario Ruiz, J. Smith, Joe Smith, Caragh Smith
20        Assert.areEqual('Mario Ruiz', empList.get(0).getName());
21    }
22}