GARANTIR DESCONTO

Fórum Ordenar um ArrayList pelo atributo #568549

10/11/2011

0

Tenho a seguinte classe Engenheiro:
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);
    }
Tenho a interface:
package Lista06;

public interface IFuncionario {

    public String getNome();

    public void CalcularSalario(double salario);

    public String imprimirDados();
}
E a classe Main:
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();
        }
    }
}

Preciso criar o metodo ordena na classe Auxiliar, como abaixo:
package Lista06;

import java.util.ArrayList;

public class Auxiliar {

    public static ArrayList<IFuncionario> Ordena(ArrayList<IFuncionario> lista) {

        return lista;
    }
}
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!!!
Pedro Henrique

Pedro Henrique

Responder

Posts

10/11/2011

Carlos Heuberger

[quote="kikop99"]Tenho a seguinte classe Engenheiro:
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);
    }
Tenho a interface:
package Lista06;

public interface IFuncionario {

    public String getNome();

    public void CalcularSalario(double salario);

    public String imprimirDados();
}
E a classe Main:
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();
        }
    }
}

Preciso criar o metodo ordena na classe Auxiliar, como abaixo:
package Lista06;

import java.util.ArrayList;

public class Auxiliar {

    public static ArrayList<IFuncionario> Ordena(ArrayList<IFuncionario> lista) {

        return lista;
    }
}
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. [[]]
Responder

Gostei + 0

10/11/2011

Pedro Henrique

Blz!! Usei a primeira opcao, de usar o comparable. Ficou assim:
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());
    }
Na linha 9(Collection.sort(lista)) da Classe "Auxiliar" mostra um erro(no suitable method found for sort):
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;
    }
}
} Tem que passar outro paramento para o metodo sort? Grato!
Responder

Gostei + 0

10/11/2011

Douglas Eric

é 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
Responder

Gostei + 0

10/11/2011

Douglas Eric

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
Responder

Gostei + 0

10/11/2011

Douglas Eric

já tentou fazer com IFuncionario extendendo o Comparable (última linha da mensagem do sekkuar)? [[]]
Responder

Gostei + 0

10/11/2011

Douglas Eric

Deu certinho!! Muito obrigado!!! Ficou assim:
public class Auxiliar {

    public static ArrayList<IFuncionario> Ordena(ArrayList<IFuncionario> lista) {  
        Collections.sort(lista);
        return lista;  
    } 
}
Usei public class Engenheiro implements IFuncionario e public interface IFuncionario extends Comparable; e o metodo da classe engenheiro
@Override
    public int compareTo(Object o) {
        Engenheiro e = (Engenheiro) o;
        return this.nome.compareToIgnoreCase(e.getNome());
    }
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar