package core; 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 - lista z klasami np. Userów //topToBottom - sortowanie od największej do najmniejszej true; od najmniejszej do największej false //getterName - nazwa gettera, wg którego obiekty zostaną posortowane np. "getLvl" //getterArgs - opcjonalne argumenty które można wprowadzić do gettera np. getLvl(true, 12) => true, 12; można zostaić puste @SuppressWarnings({ "rawtypes", "unchecked" }) public static List sort(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; } 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; } } } }