I have tried to make a generic comparator with the use of reflection, but I am not sure how efficient it is or if it is the right way to do so Also, I don't know how it will handle dates.
<T> List<?> sortList(List<T> l,String field,Class<T> c) throws NoSuchFieldException, SecurityException, IntrospectionException{
final Field f = c.getDeclaredField(field);
PropertyDescriptor propertyDescriptor = new
PropertyDescriptor(f.getName(),c);
final Method getter = propertyDescriptor.getReadMethod();
Collections.sort(l, new Comparator<T>() {
public int compare(T e1, T e2) {
int i=0;
try {
if(f.getType().isAssignableFrom(String.class)){
i = getter.invoke(e1).toString().compareTo(getter.invoke(e2).toString());
}
else if(f.getType().isAssignableFrom(int.class)){
i = Integer.parseInt(getter.invoke(e1).toString()) -
Integer.parseInt(getter.invoke(e2).toString());
}
else if(f.getType().isAssignableFrom(long.class)){
i = (int)(Long.parseLong(getter.invoke(e1).toString()) -
Long.parseLong(getter.invoke(e2).toString()));
}
else if(f.getType().isAssignableFrom(float.class)){
if(Float.parseFloat(getter.invoke(e1).toString()) -
Float.parseFloat(getter.invoke(e2).toString()) < 0)
i = -1;
else if(Float.parseFloat(getter.invoke(e1).toString()) -
Float.parseFloat(getter.invoke(e2).toString()) > 0)
i = 1;
else
i = 0;
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
return i;
}
});
return l;
}
@SortKey(order=n)annotation on properties. IMHO anything else will be too complex to be usefull... \$\endgroup\$