Ordenar um ArrayList pelo atributo
Tenho a seguinte classe Engenheiro:
Tenho a interface:
E a classe Main:
Preciso criar o metodo ordena na classe Auxiliar, como abaixo:
A minha dúvida é a seguinte: Como ordeno os objetos pelos nomes? Onde dou o Collections.sort() ? No método ordena mesmo? E parece que tem q usar compareTO para comparar 2 Strings e ordenar, mas não tenho nocao nenhuma desses métodos. Alguem poderia me ajudar e onde devo colocar o compareTO?
GRATO!!!
package Lista06;
import java.text.DecimalFormat;
public class Engenheiro implements IFuncionario{
public String nome;
public String crea;
public String cargo;
public double salario;
public Engenheiro(String nome, String crea, String cargo) {
this.nome = nome;
this.crea = crea;
this.cargo = cargo;
}
Engenheiro() {
}
@Override
public String getNome() {
return nome;
}
@Override
public void CalcularSalario(double salario) {
salario = salario * 4.5;
}
@Override
public String imprimirDados() {
DecimalFormat fm = new DecimalFormat("0.00"); // Criando o objeto fm para formatar a variavel preco com 2 casas decimais
return "\nNome: " + this.nome + "\n"
+ "CREA: " + this.crea + "\n"
+ "Cargo: " + this.cargo + "\n"
+ "Salario: R$ " + fm.format(this.salario);
}
package Lista06;
public interface IFuncionario {
public String getNome();
public void CalcularSalario(double salario);
public String imprimirDados();
}
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<IFuncionario> lista = new ArrayList<IFuncionario>();
IFuncionario f1 = new Engenheiro("Pedro", "15.255-0", "Engenheiro Civil");
IFuncionario f2 = new Engenheiro("Elias Lasmar", "12.345-0", "Engenheiro da Computação");
IFuncionario f3 = new Engenheiro("Tales", "12.311-0", "Engenheiro da Computação");
IFuncionario f4 = new Engenheiro("André", "17.875-0", "Engenheiro Mecânico");
lista.add(f1);
lista.add(f2);
lista.add(f3);
lista.add(f4);
System.out.println(" **** LISTAGEM DOS OBJETOS ORDENADOS PELO NOME **** ");
System.out.println();
//Auxiliar.Ordena(lista); // metodo a ser feito
for (int j = 0; j < lista.size(); j++) {
System.out.println(lista.get(j).imprimirDados());
System.out.println();
}
}
}
package Lista06;
import java.util.ArrayList;
public class Auxiliar {
public static ArrayList<IFuncionario> Ordena(ArrayList<IFuncionario> lista) {
return lista;
}
}Pedro Henrique
Curtidas 0
Respostas
Carlos Heuberger
10/11/2011
[quote="kikop99"]Tenho a seguinte classe Engenheiro:
Tenho a interface:
E a classe Main:
Preciso criar o metodo ordena na classe Auxiliar, como abaixo:
A minha dúvida é a seguinte: Como ordeno os objetos pelos nomes? Onde dou o Collections.sort() ? No método ordena mesmo? E parece que tem q usar compareTO para comparar 2 Strings e ordenar, mas não tenho nocao nenhuma desses métodos. Alguem poderia me ajudar e onde devo colocar o compareTO?
GRATO!!!
duas opções:
- a classe Engenheiro implementa Comparable para comparar os nomes
- cria uma instância que implementa Comparator e usa ela no sort
O 'sort' tem que ir lá onde você quer fazer a ordenação, no seu exemplo no método ordena mesmo.
Veja se o tópico: [url="http://javafree.uol.com.br/topic-883738-Ordenar-um-ArrayList-com-opcoes.html"][u]Ordenar um ArrayList com opções[/u][/url] ajuda. Qualquer coisa volte a perguntar.
[[]]
package Lista06;
import java.text.DecimalFormat;
public class Engenheiro implements IFuncionario{
public String nome;
public String crea;
public String cargo;
public double salario;
public Engenheiro(String nome, String crea, String cargo) {
this.nome = nome;
this.crea = crea;
this.cargo = cargo;
}
Engenheiro() {
}
@Override
public String getNome() {
return nome;
}
@Override
public void CalcularSalario(double salario) {
salario = salario * 4.5;
}
@Override
public String imprimirDados() {
DecimalFormat fm = new DecimalFormat("0.00"); // Criando o objeto fm para formatar a variavel preco com 2 casas decimais
return "\nNome: " + this.nome + "\n"
+ "CREA: " + this.crea + "\n"
+ "Cargo: " + this.cargo + "\n"
+ "Salario: R$ " + fm.format(this.salario);
}
package Lista06;
public interface IFuncionario {
public String getNome();
public void CalcularSalario(double salario);
public String imprimirDados();
}
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<IFuncionario> lista = new ArrayList<IFuncionario>();
IFuncionario f1 = new Engenheiro("Pedro", "15.255-0", "Engenheiro Civil");
IFuncionario f2 = new Engenheiro("Elias Lasmar", "12.345-0", "Engenheiro da Computação");
IFuncionario f3 = new Engenheiro("Tales", "12.311-0", "Engenheiro da Computação");
IFuncionario f4 = new Engenheiro("André", "17.875-0", "Engenheiro Mecânico");
lista.add(f1);
lista.add(f2);
lista.add(f3);
lista.add(f4);
System.out.println(" **** LISTAGEM DOS OBJETOS ORDENADOS PELO NOME **** ");
System.out.println();
//Auxiliar.Ordena(lista); // metodo a ser feito
for (int j = 0; j < lista.size(); j++) {
System.out.println(lista.get(j).imprimirDados());
System.out.println();
}
}
}
package Lista06;
import java.util.ArrayList;
public class Auxiliar {
public static ArrayList<IFuncionario> Ordena(ArrayList<IFuncionario> lista) {
return lista;
}
}GOSTEI 0
Pedro Henrique
10/11/2011
Blz!! Usei a primeira opcao, de usar o comparable. Ficou assim:
Na linha 9(Collection.sort(lista)) da Classe "Auxiliar" mostra um erro(no suitable method found for sort):
}
Tem que passar outro paramento para o metodo sort?
Grato!
package Lista06;
import java.text.DecimalFormat;
public class Engenheiro implements IFuncionario, Comparable {
public String nome;
public String crea;
public String cargo;
public double salario;
public Engenheiro(String nome, String crea, String cargo) {
this.nome = nome;
this.crea = crea;
this.cargo = cargo;
}
Engenheiro() {
}
@Override
public String getNome() {
return nome;
}
@Override
public void CalcularSalario(double salario) {
salario = salario * 4.5;
}
@Override
public String imprimirDados() {
DecimalFormat fm = new DecimalFormat("0.00"); // Criando o objeto fm para formatar a variavel preco com 2 casas decimais
return "\nNome: " + this.nome + "\n"
+ "CREA: " + this.crea + "\n"
+ "Cargo: " + this.cargo + "\n"
+ "Salario: R$ " + fm.format(this.salario);
}
@Override
public int compareTo(Object o) {
Engenheiro e = (Engenheiro)o;
return this.nome.compareToIgnoreCase(e.getNome());
}
package Lista06;
import java.util.ArrayList;
import java.util.Collections;
public class Auxiliar {
public static ArrayList<IFuncionario> Ordena(ArrayList<IFuncionario> lista) {
Collections.sort(lista);
return lista;
}
}GOSTEI 0
Douglas Eric
10/11/2011
é a sua classe Engenheiro que implementa Comparable, não a interface IFuncionario
Logo, a sua ArrayList precisa ser de Engenheiro, e não de IFuncionario
ou a sua Interface IFuncionario precisa extender (extends) Comparable
GOSTEI 0
Douglas Eric
10/11/2011
Sekkuar, realmente, mudei aqui e deu certo. So no Main que a chamado do metodo da erro na linha:
lista_retorno = Auxiliar.Ordena(lista);
Só que o professor pediu:
"Desenvolva uma classe chamada Auxiliar, ela deve possuir um método static chamado ordena que tem
um parâmetro do tipo array de IFuncionario, ordena este array pelo nome dos objetos IFuncionario e
retorna o array ordenado."
O array no metodo ordena nao tinha que ser do tipo <IFuncionario> ao inves de <Engenheiro> ?
vlw
GOSTEI 0
Douglas Eric
10/11/2011
já tentou fazer com IFuncionario extendendo o Comparable (última linha da mensagem do sekkuar)?
[[]]
GOSTEI 0
Douglas Eric
10/11/2011
Deu certinho!! Muito obrigado!!! Ficou assim:
Usei
public class Engenheiro implements IFuncionario e
public interface IFuncionario extends Comparable; e o metodo da classe engenheiro
public class Auxiliar {
public static ArrayList<IFuncionario> Ordena(ArrayList<IFuncionario> lista) {
Collections.sort(lista);
return lista;
}
}
@Override
public int compareTo(Object o) {
Engenheiro e = (Engenheiro) o;
return this.nome.compareToIgnoreCase(e.getNome());
}GOSTEI 0