Eu fiz uma classe que ordena por comparator de qualquer classe e pode ser usado com várias colunas de uma vez. Mais com certeza isso já foi implementado por alguém e está em alguma api, mais eu não encontrei qual api faz isso. Exemplo abaixo que eu fiz e quero saber qual api faz isso.
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Order {
public static void main(String[] args) {
Order o = new Order();
o.start();
}
public void start(){
List<Usuario> lista = new ArrayList<Usuario>();
Usuario u = new Usuario();
u.setIdade("1");
u.setLocal("abc");
u.setNome("asdf");
Usuario u2 = new Usuario();
u2.setIdade("3");
u2.setLocal("bcd");
u2.setNome("asdf");
Usuario u3 = new Usuario();
u3.setIdade("2");
u3.setLocal("dfg");
u3.setNome("casdf");
Usuario u4 = new Usuario();
u4.setIdade("0");
u4.setLocal("cdfg");
u4.setNome("wasdf");
Usuario u5 = new Usuario();
u5.setIdade("0");
u5.setLocal("abc");
u5.setNome("asdf");
lista.add(u);
lista.add(u2);
lista.add(u3);
lista.add(u4);
lista.add(u5);
inicioOrdenacao(lista);
for (Usuario usuario : lista) {
System.out.println(usuario);
}
}
private void inicioOrdenacao(List<Usuario> lista){
Collections.sort(lista, new OrdenadorGenerico(new String []{"getNome","getIdade","getLocal"},true));
}
}
class OrdenadorGenerico implements Comparator<Object>{
String[] orderBy;
boolean ascendente;
public OrdenadorGenerico(String[] orderBy,boolean ascendente){
this.orderBy = orderBy;
this.ascendente = ascendente;
}
@Override
public int compare(Object o1, Object o2) {
try {
for (int i=0;i<this.orderBy.length;i++) {
String order = orderBy[i];
int value= 0;
if(ascendente){
value = getPropriedade(order,o1).compareTo(getPropriedade(order,o2));
}else{
value = getPropriedade(order,o2).compareTo(getPropriedade(order,o1));
}
if(value != 0 || (i+1 == this.orderBy.length )){
return value;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
private String getPropriedade(String metodo,Object obj) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException{
Method method = obj.getClass().getMethod(metodo);
return (String) method.invoke(obj, new Object[] {});
}
}
class Usuario{
private String nome;
private String idade;
private String local;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getIdade() {
return idade;
}
public void setIdade(String idade) {
this.idade = idade;
}
public String getLocal() {
return local;
}
public void setLocal(String local) {
this.local = local;
}
@Override
public String toString() {
return "Usuario [idade=" + idade + ", local=" + local + ", nome="
+ nome + "]";
}
}