Fed up with writing sorting function every time??. This post will be a great relief for you.I am going to explain, How to write a java class which can be used to sort any type of java object collection in any field in any order. Thanks for introducing java 5 Generics and Reflection in Java.
/** * */ package com.shims.support; import java.lang.reflect.Field; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * @author Semika Siriwardana * */ public class SHIMSSoringSupport<T> { private List<T> objectList; private String sortField = null; private String sortOrder = null; private static final String ASC = "asc"; /** * @param * * objectList * The list to be sorted * @param sortField * The field name in which list to be sorted * * @param sortOrder * Sorting order.Either assending or decending. */ public SHIMSSoringSupport(List<T> objectList, String sortField, String sortOrder) { super(); this.objectList = objectList; this.sortField = sortField; this.sortOrder = sortOrder; } /** * Perform soring * @param aClass * @throws Exception */ public void sort(final Class aClass) throws Exception { final String _sortField = this.sortField; final String _sortOrder = this.sortOrder; Collections.sort(this.objectList, new Comparator<T>() { @Override public int compare(T o1, T o2) { try { Field sortField = aClass.getDeclaredField(_sortField); sortField.setAccessible(true); Object val1 = sortField.get(o1); Object val2 = sortField.get(o2); if (val1 instanceof String && val2 instanceof String) { if (ASC.equals(_sortOrder)){ //String field return ((String) val1).compareTo((String)val2); } else { return ((String) val2).compareTo((String)val1); } } else { //Numeric field Number num1 = (Number)val1; Number num2 = (Number)val2; if (ASC.equals(_sortOrder)) { if (num1.floatValue() > num2.floatValue()) { return 1; } else { return -1; } } else { if (num2.floatValue() > num1.floatValue()) { return 1; } else { return -1; } } } } catch (Exception e) { e.printStackTrace(); } return 0; } }); } }
Next, I will explain how to use above class to sort a list of objects. As You can see in the code, when instantiating class instance, You have to pass three constructor arguments into it.
objectList - List of objects that are needed to get sorted.
sortField - The field in which, You want to sort the collection.
sortOrder - The sorting order.This should be either 'asc' or 'desc'.
Following code shows, How to instantiate a class instance and invoke the sorting.
Think, You have a list of 'Employee' objects to sort.
List<Employee> empList = employeService.getAllEmployees(); SHIMSSoringSupport<Employee> soringSpt = new SHIMSSoringSupport<Employee>(empList, "name", "asc"); soringSpt.sort(Employee.class);
The above code will sort the employee list by it's 'name' field in ascending order.
yes you are true and the point is not to re-invent the wheeel.Equals Method in JDK 7
ReplyDelete