Jump to content
noorders

[AJUDA] Imprimir elemento do ArrayList com um determinado valor (P.O.O.)

Recommended Posts

noorders

Boas.

Estou a fazer um exercício sobre P.O.O. onde tenho que gerar uma lista telefónica para pessoas e para empresas e guardar a mesma num ArrayList.

Depois tenho que fazer o output para o ecrã de:

o Todas as entradas da agenda.

o As entradas que tenham um dado número de fax. (aqui é que está o meu problema)

Eu fiz uma hierarquia de Classes onde a Classe Agenda é a SuperClasse de Pessoa e Empresa, e depois tenho a Main Classe TesteAgenda para fazer o programa rolar.

As pessoas caracterizam-se pelo nome, número de telefone e número de telemóvel e as empresas caracterizam-se pelo nome, número de telefone, endereço de e-mail e número de fax.

Deixo aqui em baixo o meu código, pensando eu que o meu erro está na condição do último if() dentro do ciclo for() da Main Classe TesteAgenda, pois eu não sei as condições para comparar comparar os valores de instâncias de Classes guardadas em ArrayLists.

Classe Agenda

public class Agenda {
    //campos
    private String nome;
    private String numTlf;

    //construtores
    public Agenda() {
        nome = "";
        numTlf = "";
    }

    public Agenda(String nome, String numTlf) {
        this.nome = nome;
        this.numTlf = numTlf;
    }

    //métodos Get
    public String getNome() {
        return nome;
    }

    public String getNumTlf() {
        return numTlf;
    }

    //métodos Set
    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setNumTlf(String numTlf) {
        this.numTlf = numTlf;
    }

    //métodos
    @Override
    public String toString() {
        if (getNumTlf().equalsIgnoreCase("")) {
            return String.format("Nome: %s%n", nome);
        } else {
            return String.format("Nome: %s%nNúmero de Telefone: %s%n", nome, numTlf);
        }
    }

    
}

Classe Pessoa

public class Pessoa extends Agenda {
    //campos
    private String numTlm;

    //construtores
    public Pessoa() {
        super();
        numTlm = "";
    }

    public Pessoa(String nome, String numTlf, String numTlm) {
        super(nome, numTlf);
        this.numTlm = numTlm;
    }

    //métodos Get
    public String getNumTlm() {
        return numTlm;
    }

    //métodos Set
    public void setNumTlm(String numTlm) {
        this.numTlm = numTlm;
    }

    //métodos
    @Override
    public String toString() {
        if (getNumTlm().equalsIgnoreCase("")) {
            return String.format(super.toString());
        } else {
            return String.format(super.toString()+"Número de telemóvel: %s%n",numTlm);
        }
    }
}

Classe Empresa

public class Empresa extends Agenda {
    //campos

    private String email;
    private String fax;

    //construtores
    public Empresa() {
        super();
        email = "";
        fax = "";
    }

    public Empresa(String nome, String numTlf, String email, String fax) {
        super(nome, numTlf);
        this.email = email;
        this.fax = fax;
    }

    //métodos Get
    public String getEmail() {
        return email;
    }

    public String getFax() {
        return fax;
    }

    //métodos Set
    public void setEmail(String email) {
        this.email = email;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    //métodos
    @Override
    public String toString() {
        String txt = "";
        if (getEmail().equalsIgnoreCase("") && getFax().equalsIgnoreCase("")) {
            txt = super.toString();
        } else {
            txt = super.toString() + "e-mail: " + email + "\nFax: " + fax+"\n";
        }
        if (getEmail().equalsIgnoreCase("") && (!getFax().equalsIgnoreCase(""))) {
            txt = super.toString() + "Fax: " + fax+"\n";
        }
        if ((!getEmail().equalsIgnoreCase("")) && getFax().equalsIgnoreCase("")) {
            txt = super.toString() + "e-mail: " + email+"\n";
        }
        return txt;
    }
}

Main Classe TesteAgenda

import java.util.ArrayList;

public class TesteAgenda {

    public static void main(String[] args) {
        //instâncias da Classe Pessoa
        Pessoa p1 = new Pessoa("Paulo", "221456785", "945741258");
        Pessoa p2 = new Pessoa("João", "", "971254762");
        Pessoa p3 = new Pessoa("Tiago", "214529861", "");

        //instâncias da Classe Empresa
        Empresa e1 = new Empresa("ISEP", "220500400", "isep@isep.ipp.pt", "220500401");
        Empresa e2 = new Empresa("FEUP", "220600800", "feup@feup.up.pt", "");
        Empresa e3 = new Empresa("ISCAP", "220700900", "", "220700901");//é suposto este aparecer quando faço a busca por nº de fax
        Empresa e4 = new Empresa("PACSI", "220721956", "", "220700901");//é suposto este aparecer quando faço a busca por nº de fax

        //ArrayList que guarda os contactos
        ArrayList agenda = new ArrayList();

        //preenchimento do ArrayList
        agenda.add(p1);
        agenda.add(p2);
        agenda.add(p3);
        agenda.add(e1);
        agenda.add(e2);
        agenda.add(e3);
        agenda.add(e4);

        //todas as entradas da lista
        System.out.println("Todas as entradas da agenda: ");
        for (Object obj : agenda) {
            System.out.println(obj);
        }

        //entradas com um determinado nº de fax
        String fax="220700901";//nº de faz escolhido
        System.out.println("---------------------");
        System.out.println("\nEntradas com um determinado nº de fax");
        for (Object obj : agenda) {
            if(fax.equals(((Empresa)obj).getFax())){//penso que o erro está aqui
                System.out.println("Entrada encontrada:\n"+obj);
            }else{
                System.out.println("Entrada não encontrada");
            }
        }


    }
}

Se me puderem ajudar eu agradeço.

Cumprimentos :thumbsup:

Share this post


Link to post
Share on other sites
pedrocarlos

Sim o erro está aqui, " if(fax.equals(((Empresa)obj).getFax())){ " 😎

Assumes, erradamente, que tens logo uma Empresa, estás logo a fazer um casting p/ Empresa, quando a tua lista tem objectos do tipo Pessoa e Empresa.

Tens usar o operador instanceof, p/ saber 1º se o teu objecto é uma Empresa

Exemplo,

for (int i = 0; i < agendaArrayList.size(); i++) {
    Object obj = agendaArrayList.get(i);
    if (obj instanceof Empresa){
       ((Empresa)obj).getFax();
       // Depois fazes aqui a comparação
   }

Certo?? ;)

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites
Baderous

Em primeiro lugar, na classe TesteAgenda não deves usar o raw type ArrayList, deves antes usar o seu correspondente parametrizado: ArrayList<Agenda>. Sendo Agenda a superclasse de Pessoa e Empresa, podes colocar no ArrayList instâncias das suas subclasses, pois o mecanismo de polimorfismo de Java permite-o.

ArrayList<Agenda> agenda = new ArrayList<Agenda>();

Depois para percorrer todas as entradas, podes indicar explicitamente no ciclo for que o tipo dos objectos é Agenda:

for (Agenda ag : agenda)
                System.out.println(ag);

Por fim, para encontrar as entradas com um determinado nº de fax, tens de percorrer a lista de Agendas, para cada elemento tens de verificar se é uma instância da classe Empresa, e caso seja fazes o casting para o tipo Empresa da instância em questão e só então invocas o método getFax() juntamente com o equals() para determinar se a instância tem o nº de fax que procuras. Eu fiz um exemplo usando um Iterator, onde apenas procuro pela 1ª instância que verifique a condição, mas facilmente alteras isto para guardares as instâncias que verifiquem a condição num ArrayList auxiliar e depois percorres para as imprimires:

        Iterator<Agenda> it = agenda.iterator();
        boolean found = false;
        Agenda a = null;
        while (!found && it.hasNext()) {
                a = it.next();
                if (a.getClass().getSimpleName().equals("Empresa"))
                        if (((Empresa)a).getFax().equals(fax))
                                found = true;
        }
        if (found)
                System.out.println("Entrada encontrada:\n" + a);
        else
                System.out.println("Entrada não encontrada");
        }

Em alternativa ao método getClass().getSimpleName(), que vai buscar o nome da classe da instância, podes usar o instanceof, como sugerido pelo pedrocarlos.

Share this post


Link to post
Share on other sites
noorders

Boas... Desculpem a demora...

Claro que ia dizer alguma coisa (quer funciona-se ou não)  :D

O meu código ficou assim e funciona na perfeição:

//entradas com um determinado nº de fax
        String fax = "220700901";//nº de faz escolhido
        System.out.println("---------------------");
        System.out.println("\nEntradas com um determinado nº de fax");
        for (Object obj : agenda) {
            if (obj instanceof Empresa) {//verifica se o objeto é uma instância da classe Empresa
                Empresa emp = (Empresa)obj;//aqui é feito um cast
                if (emp.getFax().equals(fax)) {//verifica se o fax é o procurado
                    System.out.println("Entrada encontrada:\n" + obj);
                } else {
                    System.out.println("Entrada não encontrada");
                }
            }
        }

Muito Obrigado pedrocarlos e Baderous.

Como ainda estou a iniciar o Java, achei a solução do pedrocarlos mais "acessível" para eu conseguir implementar e perceber, mas não descarto nenhuma parte da sua informação Baderous pois tem conteúdo muito útil e profissional... Pena eu ainda não ter dado algumas coisas que estão aí no exemplo que me forneceu como o Iterator...

Mas o que interessa é que o problema está resolvido.

Muito Obrigado a vocês os dois :thumbsup:

Cumprimentos

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.