import java.lang.reflect.Method; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import com.google.common.collect.Lists; public class UniversalObjectSorter { //toSort - Collection of objects containing getter returning int/double according to which list will be sorted //topToBottom - Order of returned values in list should be decreasing (true) or rising (false) //getterName - Name of method returning int/double according to which list will be sorted //getterArgs - If necessary arguments that method getterName requires @SuppressWarnings({ "unchecked", "rawtypes" }) public static List sortCollection(Collection toSort, boolean topToBottom, String getterName, Object... getterArgs) { Method getter = null; for(Method m : ((List) toSort).get(0).getClass().getMethods()) if(m.getName().equals(getterName)) { getter = m; break; } try { if(getter.getReturnType() == Double.class || getter.getReturnType() == double.class) { HashMap map = new HashMap(); DoubleValueComparator vc = new DoubleValueComparator(map); TreeMap sorted_map = new TreeMap(vc); for(Object u : toSort) map.put(u, (Double) getter.invoke(u, getterArgs)); sorted_map.putAll(map); if(topToBottom) return Lists.newArrayList(sorted_map.keySet()); return Lists.reverse(Lists.newArrayList(sorted_map.keySet())); } else if(getter.getReturnType() == Integer.class || getter.getReturnType() == int.class) { HashMap map = new HashMap(); IntegerValueComparator vc = new IntegerValueComparator(map); TreeMap sorted_map = new TreeMap(vc); for(Object u : toSort) map.put(u, (Integer) getter.invoke(u, getterArgs)); sorted_map.putAll(map); if(topToBottom) return Lists.newArrayList(sorted_map.keySet()); return Lists.reverse(Lists.newArrayList(sorted_map.keySet())); } } catch(Exception ex) {} return null; } //toSort - Array of objects containing getter returning int/double according to which list will be sorted //topToBottom - Order of returned values in list should be decreasing (true) or rising (false) //getterName - Name of method returning int/double according to which list will be sorted //getterArgs - If necessary arguments that method getterName requires public static List sortArray(T[] toSort, boolean topToBottom, String getterName, Object... getterArgs) { Method getter = null; Object[] array = ((Object[])toSort); for(Method m : array[0].getClass().getMethods()) if(m.getName().equals(getterName)) { getter = m; break; } try { if(getter.getReturnType() == Double.class || getter.getReturnType() == double.class) { HashMap map = new HashMap(); DoubleValueComparator vc = new DoubleValueComparator(map); TreeMap sorted_map = new TreeMap(vc); for(Object u : array) map.put(u, (Double) getter.invoke(u, getterArgs)); sorted_map.putAll(map); if(topToBottom) return Lists.newArrayList(sorted_map.keySet()); return Lists.reverse(Lists.newArrayList(sorted_map.keySet())); } else if(getter.getReturnType() == Integer.class || getter.getReturnType() == int.class) { HashMap map = new HashMap(); IntegerValueComparator vc = new IntegerValueComparator(map); TreeMap sorted_map = new TreeMap(vc); for(Object u : array) map.put(u, (Integer) getter.invoke(u, getterArgs)); sorted_map.putAll(map); if(topToBottom) return Lists.newArrayList(sorted_map.keySet()); return Lists.reverse(Lists.newArrayList(sorted_map.keySet())); } } catch(Exception ex) {} return null; } private static class DoubleValueComparator implements Comparator { Map base; public DoubleValueComparator(Map base) { this.base = base; } public int compare(Object a, Object b) { if (base.get(a) >= base.get(b)) return -1; else return 1; } } private static class IntegerValueComparator implements Comparator { Map base; public IntegerValueComparator(Map base) { this.base = base; } public int compare(Object a, Object b) { if (base.get(a) >= base.get(b)) return -1; else return 1; } } }