Ajuda com algoritmo

9 respostas
dgouvea

Não é necessário criar métodos de ordenação, caso você utilize arrays primitivos, pode utilizar a classe java.util.Arrays, ou em caso de coleções java.util.Collections, essas classes permitem a ordenação de arrays e de coleções de diversas formas. utilizando o método ‘sort’, você pode passar um Comparator como parâmetro, você pode fazer um comparator para cada atributo de ordenação.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html

Espero ter ajudado,
abraços

9 Respostas

marciobarroso

Não custa tentar …

display tab library

[]'s

dgouvea

Se for possivel utilizar um DisplayTag em seu projeto pode ter certeza que ele vai facilitar muito a sua vida. Pelo menos metade da sua implementação vai embora.

dgouvea

Da uma olhada em um exemplo:

import java.util.Arrays;
import java.util.Comparator;

import org.apache.commons.beanutils.PropertyUtils;

public class MyComparator implements Comparator<Object> {

	private String atributo;

	public String getAtributo() {
		return atributo;
	}

	public void setAtributo(String atributo) {
		this.atributo = atributo;
	}

	public int compare(Object obj1, Object obj2) {
		try {
			Object o1 = PropertyUtils.getProperty(obj1, atributo);
			Object o2 = PropertyUtils.getProperty(obj2, atributo);
			
			if (o1 instanceof Comparable && o2 instanceof Comparable) {
				Comparable c1 = (Comparable) o1;
				Comparable c2 = (Comparable) o2;
				
				return c1.compareTo(c2);
			}
			
			return o1 == o2 ? 0 : -1;
		} catch (Exception e) {
			return -1;
		}
	}
	
	public static void main(String[] args) {
		Pessoa p1 = new Pessoa();
		p1.setNome("Antônio");
		p1.setIdade(21);
		
		Pessoa p2 = new Pessoa();
		p2.setNome("Maria");
		p2.setIdade(5);
		
		Pessoa p3 = new Pessoa();
		p3.setNome("José");
		p3.setIdade(21);
		
		Pessoa[] pessoas = new Pessoa[3];
		pessoas[0] = p1;
		pessoas[1] = p2;
		pessoas[2] = p3;
		
		MyComparator myComparator = new MyComparator();
		myComparator.setAtributo("nome");
		Arrays.sort(pessoas, myComparator);
		
		mostrar(pessoas);
		System.out.println();
		
		myComparator.setAtributo("idade");
		Arrays.sort(pessoas, myComparator);
		
		mostrar(pessoas);
	}
	
	private static void mostrar(Pessoa[] pessoas) {
		for (Pessoa pessoa : pessoas) {
			System.out.println(pessoa.getNome());
		}
	}

}
marciobarroso

Vc pode criar uma query dinâmica que receba o número da coluna que vc quer ordenar e fazer a ordenação no banco …

e então, a cada coluna vc manda o seu número para a query … com certeza vai funcionar …

[]'s

neohacker

Bem eu nunca usaria algo desse tipo, dai o usuário ia ficar brincando de ordenar e fico toda hora buscando no banco, imagine isso numa tabela de sei lá 1milhão de registros, capaz de derrubar o banco auhauhau…

L

Olá,
Estou com problemas para achar uma solução para o meu problema. Talvez al´guém que já tenha mais experiência possa me ajudar. Estou desenvolvendo uma aplicação web que já existe há alguns anos e agora preciso ordenar arrays.
O que acontece é que eu tenho uma tabela e preciso ordenar pelas colunas. Ok, até aí um quicksort resolve.
Acontece que eu quero fazer um método único para que eu possa ordenar vários tipos de tabela: produtos, fornecedores, etc. Estas classes não herdam de nenhuma classe em comum, exceto object e alterá-las poderia causar um impacto bem grande.
Eu quero que quando o usuário clique em “código”, a tabela seja ordenada por código, quando clicar em “nome”, seja ordenada por nome, etc. Em cada tabela as colunas tem nomes diferentes.
Existe algum meio de que centralizadamente eu ordene todas as tabelas?

Obrigado,
Oscar

L

Olá,
Obrigado pelas respostas.
Eu precisava de uma ordenação bem eficiente, pois preciso ordenar muitos registros. Então preferi implementar um quicksort a usar o sort.
Sobre a display tag, ela é o motivo de eu estar fazendo este trabalho. Meus colegas de projeto me disseram que estavam utilizando ela, porém esta só ordenava a primeira página da tabela (temos tabelas paginadas). E então era para eu ver se conseguia fazer um método de ordenação que fosse eficiente o suficiente para ordenar todos os registros e que o fizesse com todos os registros da tabela de uma vez.
Ainad estou implementando mas acho que vou conseguir: fiz um quicksort onde o desenvolvedor vai me passar a lista, o nome da classe dos objetos que estão na lista (no meu caso os objetos de uma lista são da mesma classe) e o método para recuperar o valor da coluna a ser ordenada. Com isto eu uso reflection para pegar o método e utilizo o quicksort. Tratando tudo como strings.
Por enquanto não achei nenhum problema, é um pouco trabalhoso, mas está funcionando por agora.
Uma dúvida com os sort’s, que me surgiu agora:
No comparator eu defino qual valor dos objetos será comparado, certo? (Por exemplo: para a classe Pessoa, se será o nome, idade, etc).Aí apenas preciso dar o Array.sort()?

Obrigado,
Oscar

L

dgouvea:
Foi mais ou menos isto que eu acabei fazendo, um pouco mais complicado. Na proxima vez eu uso esta sua idéia que é bem mais cimples que a minha hehe.
Marcio:
Sim, mas para isto, cada vez que o usuário clicasse na ordenação eu teria que buscar os registros do banco de novo. Deste jeito isto não é necessário.

Oscar

L

É por isto que eu estou procurando um outro jeito hehehe

Criado 7 de maio de 2007
Ultima resposta 8 de mai. de 2007
Respostas 9
Participantes 4