Sorting objects generic class
public abstract class Comparator { public abstract Integer compare(Object o1, Object o2); public static void sort(Object[] values, Comparator comp) { // Obtain the list type of values Object[] temp = values.clone(); temp.clear(); // Helper class for sorting using Comparable Helper[] tempValues = new Helper[0]; for(Object value: values) { tempValues.add(new Helper(comp, value)); } // Perform sort tempValues.sort(); // Extract values back into temp list for(Helper helper: tempValues) { temp.add(helper.value); } // And set the list to the new, sorted order values.clear(); values.addAll(temp); } // Simply calls Comparator when asked. class Helper implements Comparable { Comparator method; Object value; Helper(Comparator comp, Object val) { method = comp; value = val; } public Integer compareTo(Object o) { return method.compare(value, ((Helper)o).value); } } }
Compare Strings
public class AccountNameComparator extends Comparator { public override Integer compare(Object a, Object b) { return ((Account)a).name.compareTo(((Account)b).name); } }
Compare Dates
public class PriceHistoryPriceDateCompare extends Comparator { public override Integer compare(Object a, Object b) { return (DateTime.newInstance(((History__c)a).Price_Date__c.year(), ((History__c)a).Price_Date__c.month(),1).getTime().format()).compareTo((DateTime.newInstance(((History__c)b).Price_Date__c.year(), ((History__c)b).Price_Date__c.month(), 1).getTime()).format()); } }
Test Class
@isTest(SeeAllData=true) static void testComparator(){ List<Account> accountToSort = new List<Account>(); for (Integer k = 70;k > 64;k--){ Account acc = (Account)SmartFactory.createSObject('Account'); acc.Name = String.fromCharArray(new List<integer> {k}); insert acc; accountToSort.add(acc); } Test.startTest(); Comparator.sort(accountToSort, new AccountNameComparator()); System.assertEquals(accountToSort.get(0).Name, 'A'); System.assertEquals(accountToSort.get(1).Name, 'B'); System.assertEquals(accountToSort.get(2).Name, 'C'); System.assertEquals(accountToSort.get(3).Name, 'D'); System.assertEquals(accountToSort.get(4).Name, 'E'); System.assertEquals(accountToSort.get(5).Name, 'F'); Test.stopTest(); }