[Resolvido] Como ordenar List ou ArrayList de Data com Objeto próprio

Salve Salve Rapazeada Boa,
este é meu primeiro Post, qualquer coisa errada me desculpem antecipadamente e me auxiliem para corrigir, e também sou iniciante em Java(mas sei um pouquinho para não pedir programas prontos, hehehe :slight_smile:

Meu problema já vi parecido em alguns tópicos, mas não consegui resolvê-lo com eles.
Eu preciso gerar um relatório que imprima estes dados em ordem Crescente de Matricula e Descrecente de Data de Pagamento.

Bem, eu tenho a seguinte Classe


public class Funcionario {

	private String empresa;
	private String matricula;
	private String nome;
	private String pagamento
	private Double salario;

	/**
	 * Construtor Padrão, apenas para instaciar a classe
	 */
	public Funcionario() {};
	
	/**
	 * Construtor para iniciar a classe já populando seus atributos
	 * @param empresa
	 * @param matricula
	 * @param nome
	 * @param pagamento
	 * @param salario
	 */
	public Funcionario(String empresa, String matricula, String nome, String pagamento, Double salario) {
		this.empresa = empresa;
		this.matricula = matricula;
		this.nome = nome;
		this.pagamento = pagamento;
		this.salario = salario;
	}
	
	// Métodos Get e Set ...
	
	public String toString(){
		return	"Empresa " + empresa + "\tMatricula " + matricula + "\tNome " + nome +
				"\tPagamento " + pagamento + "\tSalario " + salario;
	}

}

eu alimento o Objeto desta classe do Banco de Dados e retorno a Matricula como numeros armazenados como String e a Data de Pagamento como String também, no formato “dd/MM/yyyy”.

A Classe é essa:

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import br.com.teste1.XConnection;

public class SalarioArray {

	public static void main(String[] args) throws Exception {
		XConnection conexao = new XConnection();
		ResultSet rsFuncionario;
		int cont=0;
		List<Funcionario> listaFuncionario = new ArrayList<Funcionario>();
		List<Funcionario> listaTeste = new ArrayList<Funcionario>();
		
		String consultaFuncionario =	"SELECT	EMPRESA, MATRICULA_COMPLETA, RTRIM(NOME) AS NOME, " +
								"		PAGAMENTO, SALARIO " +
								"FROM	FUNCIONARIO_SALARIO " +
								"WHERE	MATRICULA_COMPLETA IN ('1111111111', '2222222222', '3333333333', '4444444444', '5555555555)" +
								"ORDER BY MATRICULA_COMPLETA DESC"; 
		
		rsFuncionario = conexao.seleciona(consultaFuncionario);
		while (rsFuncionario.next())
        {
			listaFuncionario.add(new Funcionario(
							rsFuncionario.getString("EMPRESA"),
							rsFuncionario.getString("MATRICULA_COMPLETA"),
							rsFuncionario.getString("NOME"),
							rsFuncionario.getString("PAGAMENTO"),
							rsFuncionario.getDouble("SALARIO"))
							);
			cont++;
        }
		
		listaTeste = listaFuncionario;
		
		for (Funcionario funcionario1 : listaFuncionario) {
			System.out.println(funcionario1.toString());
		}
		for (int i=0; i<listaTeste.size(); i++) {
			System.out.println(i + " - " + listaTeste.get(i).toString());
		}
		System.out.println("Quantidade de Registros " + cont);
		
		conexao.fechaConexao();

	}

}

A Classe acima funciona sem problemas, o listaFuncionario está sendo populado numa boa, porém não consigo ordenar pela Data de forma Descrecente.

Tentei assim logo após “listaTeste = listaFuncionario;”, mas não funcionou:

Collections.sort( listaTeste , new Comparator() {  
	public int compare(Object o1, Object o2) {  
		List<Funcionario> l1 = (List<Funcionario>) o1; 
		List<Funcionario> l2 = (List<Funcionario>) o2; 

		String n1 = (String) l1.get(1).getPagamento();  
		String n2 = (String) l2.get(1).getPagamento();  

		int ret = n1.compareTo(n2);  
		return ret;  
		}  
	}
);

Me dêem uma luz ae por favor, porque só consegui com um List simples, como List, e o Collections.sort simples. Se eu tento ordenar assim, Collections.sort((List)listaBeneficiario); , também não funciona.
O erro é o mesmo com .sort simples e com o .sort com dois parâmetros: " Exception in thread “main” java.lang.ClassCastException: saldodevedor.BeneficiarioEmbrapar "

Grato, …
.

qual data?

essa data ta no banco de dados?

EDIT: desculpe não tinha visto que o pagamento era a data

Tipo, assim não funciona?

. Collections.sort( listaTeste , new Comparator<Funcionario>() { public int compare(Funcionario o1, Funcionario o2) { return o1.getPagamento().compareTo(o2.getPagamento()); } } );

Se bem que não sei se você vai conseguir ordenar pela data certinho sendo que ela ta no formato string…

E realmente, porque vc ja não faz a consulta no banco ordenando?

Não te entendi muito bem douglaskd.

No banco a Data está no formato Americano, mas vacilei em um detalhe, o campo PAGAMENTO no SELECT eu busco assim:
“CONVERT(CHAR(10),PAGAMENTO,103) AS PAGAMENTO”, o que me retorna uma data no formato “dd/MM/yyyy” do tipo String.

Mas não é isso que está dando erro em meu programa. O erro stá sendo no momento de utilizar o Collections.sort().

Agradeço a ajuda…

Neno,
agradeço, mas continua dando o mesmo erro.
Eu estava justamente fazendo com o ORDER BY PAGAMENTO DESC, porém o retorno é uma ordenação errada. Meu Banco é o SQLServer2008.
Ele resulta nisso, por exemplo: 01/01/2010; 01/02/2010; 01/03/2010; 02/01/2010; 02/02/2010; 02/03/2010; 01/03/2010; 03/02/2010; 03/03/2010; …; ou seja, ele ordena primeiro o dia, depois o mês e depois o ano, quando deveria fazer ao contrário.

Mas agradeço ainda assim…
.

Valeu Neno, funcionou aqui cara.
Faltava somente passar o meu Objeto como um Genérico para o Comparator.

Grato e Abraço…

rod, qual exeção que ele jogua quando tentar da o sort?

Mas assim, na sua query não retorna o order legal por causa do convert, ele ordena como char. Mas o mesmo aconteceria no java, ele ordenaria como uma string e não como uma Data mesmo, ja que vc ta trazendo a data como string.

Ou vc adiciona uma coluna no seu select só pra conseguir ordenar, ou vc transforma a string no java e ordena depois…

se vc fizesse o select assim

SELECT "CONVERT(CHAR(10),PAGAMENTO,103) AS PAGAMENTO", PAGAMENTO as data FROM TABELA order by data DESC

e na hora de pegar o result set ignorasse a coluna data, … pegasse so o PAGAMENTO, não seria viavel?

Opa, show, não tinha visto a resposta, Beleza

Neno “IRMÃO”,
agora você matou a charada.

Eu estava criando uma List auxiliar para receber os dados do Banco e depois dando um SimpleDateFormat duas vezes para converter de String para Data e depois, depois ordenar a Data, a[i trnasformava a Data novamente para String para aí depois usar o Collections.reverse();, …, enfim, você resolveu esse meu rolo com uma solução muito mais simples. Hehehehe. Tu és o Cara amigo.

Muito Agradecido…
.