Ordenar Lista de Objetos por um determinado atributo

Olá…

Alguem ae tem ideia de como eu poderia fazer isso?

Exemplo…

Lista = Contendo 5 Objetos, com os seguintes atributos…
Nome
Idade
Cidade

Gostaria de Ordenar os objetos desta lista pelo atributo nome? tem como?

Grato…

[]'s

Kra eu to aprendendi esa parada na facul tb, e lá agente fez o seguinte:

1 - coloca os dados num vetor

2- Faz a ordenacao desse vetor com akeles metodos (bolha, merge, etc) utilizando uma busca linear.

mas tb tem que montar um vetor q guarde o indice em q estao os dados para poder exibi-los depois.

é meio complicado, mas é só questão de logica de programacao mesmo.

espero ter ajudado mais do q confundido heheh

abraco

Em Java você já tem implementação do QuickSort (o melhor).

basta fazer:

   Collections.sort(minhaLista, meuComparador);

Onde minhaLista é um objeto da classe ArrayList, LinkedList, Vector, etc. E meuComparador é um objeto de uma classe que implementa a interface java.util.Comparator. Você é que tem que implementar essa classe de acordo com o tipo de ordenação que quer fazer dos objetos que estão na coleção.

Um exemplo. Digamos que você tenha uma lista de clientes.

public class Cliente {
   private int id;
   private String nome

  // setters e getters
}

Agora vamos criar um comparador que serve para ordenar os clientes em ordem alfabética pelo nome.

public class MeuComparador  implements java.util.Comparator {
 public int compare(Object o1, Object o2){
    Cliente c1 = (Cliente) o1;
    Cliente c2 = (Cliente) o2;

     return c1.getNome().compareTo(c2.getNome());
  }
}

Já se você quiser ordenar por ordem decrescente de id, o comparador seria assim:

public class MeuComparador2 implements java.util.Comparator {
 public int compare(Object o1, Object o2){
    Cliente c1 = (Cliente) o1;
    Cliente c2 = (Cliente) o2;

     return c1.getId() -  c2.getId();
  }
}

Leia esses detalhes sobre Comparator.

Andre, você fez uma pequena confusão. os algoritmos bolha e merge não são de busca linear. Eles são algoritmos de ordenação. Os algoritmos de busca linear são busca sequencial, busca binária, etc. :wink:

Valeu Vinci…Testado e Aprovado :wink:
apenas para acrescentar que o Collections tem o metodo:
Collections.reverse(list); que reverte a ordem da lista…
Sera que esta eh a melhor forma para eu ter uma lista em ordem decrescente? Ordena-la normal e depois reverter? nao fica meio POG?
nao achei nenhum metodo que ordenasse de forma decrescente de primeira!

Encotrei este tópico pesquisando por ordenação de arraylists e me foi muito útil.

Como eu faria pra ordenar por dois atributos ? Devo precisar de um laço …
por exemplo… primeiro pela cidade e depois pelo nome do objeto cliente em questão ?

desta forma eu obtive a lista de projetos ordenados pelo nome.

@Override public int compareTo(Projeto projeto) { return nomeProj.compareTo(projeto.nomeProj); }

olha cara não consegui entender muito bem essa parte do Collections, dai eu fiz de outra maneira e funcionou com o método Arrays.sort, passa o que tu quer ordenar para um array, usa o método Arrays.sort, e depois vai inserindo num vetor:

public void ordena(){
		
		double[] peso = new double[animais.size()];
		//Passa os valores para um array auxiliar
		for(int i = 0; i < peso.length; i++){
			peso[i] = animais.get(i).getPeso();
		}
		
		//ordena o array
		Arrays.sort(peso);
		
		//cria um array auxiliar para ordenar do maior para o menor
		double[] maiorMenor = new double[peso.length];
		
		//cria um vector auxiliar para fazer a troca
		Vector <Animais> aux = new Vector <Animais> (1,1);
		
		int count = 0;
		
		//ordena em ordem decrescente
		maiorMenor = this.inverteOrdem(peso);
		
		//passa os animais ja ordenados em ordem decrescente para o vector auxiliar
		while(count < animais.size()){
			for(int i = 0; i < animais.size(); i++){
				if(animais.get(i).getPeso() == maiorMenor[count])
					if(aux.contains(animais.get(i)) == false)
					aux.add(animais.get(i));
			}
			count++;
		}
		return aux;
	}

Esse é um trabalho que tive que fazer, e funciona tambem com String .

pelo que eu entendi, o collections requer que você implemente um método
que faça a comparação dos objetos e este métovo é um override(compareTo)
da classe pai Caparator.

fiz isso e deu certo.

Eu tava precisando ordenar utilizando 2 atributos.

por exemplo …

BH - Amanda
BH - Barnardo
BH - Lucas

SP - Amarildo
SP - Bruna
SP - Carlos

etc

Dá uma olhada nesse tópico: http://www.guj.com.br/posts/list/54036.java#284273

Explica em detalhes o comparator e o comparable.

Para ordenar por 2 atributos, é só escrever um comparator que leve os dois em consideração:

[code]public int compareTo(Cliente outro) {
int estado = getEstado().compareTo(outro.getEstado());

//Se o estado for diferente, retorna o resultado da comparação por estado
if (estado != 0) return estado;

//Caso contrário, ordena por nome:
return getNome().compareTo(outro.getNome());
}[/code]

Sei que faz tempo, mas muita gente (como eu) ainda tem essas duvidas,
resolvi isso com poucas linhas, usando como base o exemplo do VinyGodoy para vetor

for (int i = 0; i < suaLista.size() - 1; ++i) {
    SeuObjeto tmp = suaLista.get(i);
    for (int j = i + 1; j < suaLista.size(); ++j) {
        SeuObjeto tmp2 = suaLista.get(j);
        if (tmp.getAtributo().compareTo(tmp2.getAtributo()) > 0) {
            SeuObjeto temp = tmp;
            suaLista.set(i, tmp2);
            suaLista.set(j, temp);
        }
    }
}