noorders 0 Posted March 28, 2011 Report Share Posted March 28, 2011 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 Link to post Share on other sites
pedrocarlos 0 Posted March 28, 2011 Report Share Posted March 28, 2011 (edited) 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 January 29, 2014 by Rui Carlos GeSHi Link to post Share on other sites
Baderous 31 Posted March 28, 2011 Report Share Posted March 28, 2011 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. Link to post Share on other sites
pedrocarlos 0 Posted March 28, 2011 Report Share Posted March 28, 2011 Oh noorders, Corrige e depois diz alguma coisa Cumps Link to post Share on other sites
noorders 0 Posted March 28, 2011 Author Report Share Posted March 28, 2011 Boas... Desculpem a demora... Claro que ia dizer alguma coisa (quer funciona-se ou não) 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 Cumprimentos Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now