Comparator generico com várias colunas

3 respostas
E

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 + "]";
	}
	
}

3 Respostas

A

Boa talvez nao tenha nenhuma API feita ainda .

G

Na API padrão não existe nada parecido, mas usando o Apache Commons se pode conseguir esse efeito usando as classes BeanComparator e ComparatorChain

Seria mais ou menos assim:

Collections.sort(lista, new ComparatorChain(Arrays.asList( new BeanComparator("nome"), new BeanComparator("idade"), new BeanComparator("local"))));
Ele também tem outras opções para permitir ordem ascendente ou descendente em cada etapa da comparação.

http://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanComparator.html
https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/comparators/ComparatorChain.html

E

gomesrod:
Na API padrão não existe nada parecido, mas usando o Apache Commons se pode conseguir esse efeito usando as classes BeanComparator e ComparatorChain

Seria mais ou menos assim:

Collections.sort(lista, new ComparatorChain(Arrays.asList( new BeanComparator("nome"), new BeanComparator("idade"), new BeanComparator("local"))));
Ele também tem outras opções para permitir ordem ascendente ou descendente em cada etapa da comparação.

http://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanComparator.html
https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/comparators/ComparatorChain.html

Isso mesmo bicho

Criado 13 de fevereiro de 2014
Ultima resposta 14 de fev. de 2014
Respostas 3
Participantes 3