Ordenação de objetos por atributos em Array List

9 respostas
Danielrricci

Boa noite pessoal!

Estou com uma dúvida sobre ordenação de objetos por atributos em Array list!

Tenho um programa que cadastra alunos, onde o objeto aluno possui 4 atributos (matrícula, nome, coeficiente e sexo). Tenho um método que recebe como parametro este atributo (aluno), porém para não sobrecarregar a memória principal quero preencher um Array list com objetos aluno apenas com dois atributos: um para matrícula que é o campo chave e outro para atributo informado pelo usuário (nome ou coeficiente). Após o preenchimento do Array list eu preciso ordená-lo para então imprimi-los na tela em ordem crescente ou decrescente, conforme escolha do usuário.

Exemplo de código que estou usando:

public class Aluno{

   private int matricula;
   private String nome;

public Aluno(int m, String n){

    matricula = m;
    nome = n;

}

public preencheLista(Aluno aluno){

   for(Aluno nome: aluno){
      List.add(nome);
   }
 }
}

O código que estou usando para preencher é esse. O eclipse está marcando o aluno dentro do for e não dá sugestão para correção! Será que vocês tem uma idéia do que possa ser o problema? Essa é apenas uma parte do código, o código completo é bem grande mas caso seja necessário eu posso link ela também ok?

Obrigado!

Daniel

9 Respostas

M

Bom, eu não entendi o pq você precisa do for dentro de preencheLista() se você ja ta passando como parâmetro uma variável do tipo aluno nao seria mais fácil fazer

Lista.add(aluno)

Para passar pelo for só pra pegar o nome você tem que fazer algo do tipo:

for(Aluno aluno: listaDeAlunos){ Lista.add(aluno.getNome()); }

Lavieri

se vc ker / precisa ordenar pelo nome, a sua lista, vc pode fazer isso...

public class Aluno{  
   public static final Comparator<Aluno> POR_NOME = new Comparator<Aluno>() { public int compare(Aluno a1, Aluno a2) { return a1.compareTo(a2); } }
   private int matricula;  
   private String nome;  
  
   public Aluno(int m, String n){  
  
      matricula = m;  
      nome = n;  
  
   }

ai para sortear a lista basta fazer

Collections.sort(lista,Aluno.POR_NOME);

esse comando vai sortear a lisa, por nome de aluno

S

public preencheLista(Aluno aluno){ for(Aluno nome: aluno){ List.add(nome); } }

Cara perceba que você está colocando um form para percorrer uma “variável” (o correto é Objeto) que não é um array. Nesse caso basta apenas fazer: List.add(aluno) se o List for de Aluno. Se você receber um array de Aluno então ficaria assim:

for (Aluno al: aluno){
    List.add(al.getNome()); //Lembre que nomear a variável como "nome" não quer dizer que vc  está com o nome do aluno, logo vc tem que fazer o getNome().
}

Espero ter ajudado.

tnaires

Outra forma é você fazer sua classe aluno implementar a interface Comparator e usar um SortedSet, e não um ArrayList, para armazená-los.

Danielrricci

Ei pessoal obrigado pelos toques, vou tentar implementar fazendo as devidas correções, caso consiga eu vou postar o código aqui para conhecimento!

Me parece que eu estava cometendo dois erros:

  • Primeiro colocando na lista o objeto aluno ao invéz do nome, ou melhor, getNome;
  • Segundo esquecendo de implementar a interface comparable, o método sort, para fazer a ordenação de acordo com o atributo informado pelo usuário.

Bom vou fazer os ajuste e qualquer coisa eu retorno aqui para postar o código funcionando ou tirar mais algumas dúvidas blz?

Ah! Só uma coisinha que me ocorreu aqui agora: se eu preencher a lista apenas com os nomes, getNome, como farei depois para imprimir o objeto aluno completo com os quatro atributos (matrícula, nome, coeficiente e sexo)? É que meu construtor possui 4 atributos (mencionados acima) e estes são armazenados em um arquivo, porém estou usando este procedimento de preencher uma lista com objetos de apenas dois dos atributos para não sobrecarregar a memória principal, um atributo chave no caso matricula (usada para posicionar o ponteiro no arquivo) e o outro atributo escolhido pelo usuário para fazer a ordenação (no caso poderá ser o nome ou o coeficiente).

Disse uma cosinha e acabei escrevendo bastante!

Agradeço a todos ai pela colaboração! Realmente este guj é muito bom pela atenção que dão aos amigos que estão no caminho java hehe.

Lavieri

Não coloque os nomes na lista, coloque os objetos…

Crie um comparator para ordenar pelo atributo que vc ker…

Implemente comparable se quiser definir uma ordem natural…

Para ordenar por uma ordem especifica utilize
Collections.sort(lista,comparator);

lembrando que sorted sets, são lista classificadas, e portanto não podem ser reordenadas seguindo exclusivamente a ordem natural definida em Comparable

Danielrricci

Como prometido, vou postar o código que funcionou para o meu problema!

import java.util.Comparator;

public class AlunoComparatorNome implements Comparator<Aluno>{
	
		public int compare(Aluno a1, Aluno a2){
			int nomeComparacao = a1.getNome().compareTo(a2.getNome()); // compara nome

			if (nomeComparacao != 0){
				return nomeComparacao;
			}
			return nomeComparacao; 
		}
}

Obrigado aos que me deram uma força!

Lavieri
Danielrricci:
Como prometido, vou postar o código que funcionou para o meu problema!
import java.util.Comparator;

public class AlunoComparatorNome implements Comparator<Aluno>{
	
		public int compare(Aluno a1, Aluno a2){
			int nomeComparacao = a1.getNome().compareTo(a2.getNome()); // compara nome

			if (nomeComparacao != 0){
				return nomeComparacao;
			}
			return nomeComparacao; 
		}
}

Obrigado aos que me deram uma força!

apenas lembrando, que esse IF no seu código é meio inutil =x ... so seria util, caso vc quisesse ter um plano "B" para quando os nomes fossem iguais... de acordo com o seu código, o if é dispensável, um modo de ter uma comparação secundaria seria...

public class AlunoComparatorNome implements Comparator<Aluno>{
	
		public int compare(Aluno a1, Aluno a2){
			int nomeComparacao = a1.getNome().compareTo(a2.getNome()); // compara nome

			if (nomeComparacao != 0){
				return nomeComparacao;
			}
			return a1.getMatricula() - a2.getMatricula();  //se os nomes forem iguais, compara as matriculas
		}
}
Danielrricci

Opa é verdade! Valeu pelo toque, ainda tenho dificuldades em entender o funcionamento de umas funcionalidades do java!

Abraço e obrigado pela ajuda!

Daniel

Criado 4 de junho de 2009
Ultima resposta 7 de jun. de 2009
Respostas 9
Participantes 5