1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problemas na escrita em ArrayList

Discussão em 'Programação' iniciada por Tiago Correia, 1 de Julho de 2008. (Respostas: 13; Visualizações: 938)

  1. Tenho a classe accoes e um dos métodos da classe acções é registarpaciente. o objectivo desse método é guardar registos de pacientes. os dados de cada paciente são guardados num arraylist, sendo aqui que surge o principal problema. no codigo como tenho em cima eu crio o arraylist paciente dentro do método registarpaciente, e cada vez que invoco o método registarpacientes ele escreve um novo registo no arraylist e apaga o anterior, pois parece-me que tou a criar um novo Arraylist pacientes cada vez que invoco o método.



    Código:
    [LIST=1]
    [*]static void registarPaciente1() {   
    [*]String ficheiro="HL7.dat";   
    [*]int id=[COLOR=#c00000]6[/COLOR];   </SPAN>
    [*]ADT a = leDadosPaciente(id);   
    [*]a.PAC.id=id;   
    [*]ArrayList<ADT> pacientes = new ArrayList<ADT>();               </SPAN>
    [*]try {   </SPAN>
    [*]        pacientes.add(a);   
    [*]        FileOutputStream fos =new FileOutputStream(ficheiro);   </SPAN>
    [*]        ObjectOutputStream oos = new ObjectOutputStream(fos);   </SPAN>
    [*]        oos.writeObject(pacientes);   
    [*]        oos.close();       
    [*]    }         
    [*]           
    [*]catch (Exception e) {   </SPAN>
    [*]    e.printStackTrace();     
    [*]}  
    [/LIST]



    Por isso parece-me que a solução para o meu problema é fazer o arrayList como um objecto da classe accoes. o Problema é que eu não estou a conseguir criar o construtor para o objecto arraylist paciente.

    o códico para o construtor não deveria ser qualquer coisa como[​IMG]???


    1. Código:
      public accoes(){   
      [*]    this.pacientes=new ArrayList<ADT>();   
      [*]}  
      [/LIST]
     
  2. AliFromCairo

    AliFromCairo Power Member

    Assumindo que a variável "pacientes" é do tipo List<ADT> ou ArrayList<ADT>, esse código parece-me estar correcto.
     
    Última edição: 1 de Julho de 2008
  3. nasic

    nasic Power Member

    public Accoes(){
    ...
    }
     
  4. Boa Noite a Todos
    O codigo que tenho em cima relativamente ao método registarPaciente não está correcto, pois cada vez que invoco a função ele cria-me um arraylist novo, apagando as listas gravadas....

    Axo que o código correcto seria o seguinte

    Código:
    static void registarPaciente1() {
      
      String ficheiro="HL7.dat"; 
      ArrayList <ADT>pacientes;
      
      int id=6;
      ADT a = leDadosPaciente(id);
      a.PAC.id=id;
      
         
      try {
        pacientes.add(a);
        FileOutputStream fos =new FileOutputStream(ficheiro);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(pacientes);
        oos.close(); 
       }  
        
      catch (Exception e) {
       e.printStackTrace();  
      }
      
      
      geral.limparEcra();
      
     }

    Portanto, axo que vou ter de instanciar o arraylist pacientes fora do metodo registarPacietes.
     
  5. instanciando fora do método registarPacientes tenho um erro que é:"variable pacientes might not have been initialized"

    O problema deve estar no construtor para o objecto ArrayList <ADT>pacientes;


    tenho o seguinte construtor:

    Código:
    private ArrayList <ADT>pacientes;
     
     public accoes(ArrayList <ADT>pacientes ){
      this.pacientes=new ArrayList<ADT>();
     }
    O que estará mal?

    Obrigado pela atenção prestada :D
     
  6. napalm

    napalm Power Member

    Código:
    private ArrayList <ADT>pacientes = new ArrayList<ADT>();
    
    Não precisas do construtor.
     
  7. Mas então como resolvo o seguinte erro: "variable pacientes might not have been initialized"?

    Abraço
     
  8. nasic

    nasic Power Member

    Como o napalm disse, o arraylist já é inicializado.
     
  9. joao.miguel

    joao.miguel Power Member

    Chega-te isto ?

    Se estás a usar genéricos, usa classes com genéricos. Não voltes às collections antigas. Estas são mais eficazes e melhores para o que pretendes.

    Código:
    public class ClassName
    {
    private static List<ADT> pacientes; //declaração da variável estática
    
    static ClassName() //construtor estático
    {
    pacientes = new List<ADT>();
    }
    private static void registarPaciente1() {
      
      String ficheiro="HL7.dat"; 
      
      int id=6;
      ADT a = leDadosPaciente(id);
      a.PAC.id=id;
      
         
      try {
        pacientes.add(a);//o acesso a objectos estáticos é sempre sem o "this."
        FileOutputStream fos =new FileOutputStream(ficheiro);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(pacientes);
        oos.close(); 
       }  
        
      catch (Exception e) {
       e.printStackTrace();  
      }
      
      
      geral.limparEcra();
      
     }
    }
     
  10. smpme

    smpme Power Member

    A mim parece-me que estás a abordar muito o problema "à C" e não ao paradigma do OO que suponho que seja o objectivo desse trabalho. Claro que posso estar errado.

    Mas por partes:

    - O primeiro código de todos está mal porque sstás a fazer um new (a criar uma nova lista) cada vez que invocas o método, logo estás a adicionar o teu paciente a uma lista vazia que depois vais escrever. Logicamente quando escreves a lista ela irá apenas escrever esse paciente.

    - Não devias estar a usar um método estático. Devias ter uma classe que supostamente estaria a gerir toda essa lista de pacientes com os métodos correspondentes (uma abordagem OO da coisa).

    Tipo:

    Código:
    
    public class PatientManager {
    
       private ArrayList<Patient> patientList;
    
       public PatientManager() {
          // carregar a lista do ficheiro ou criar uma nova com:
          this.patientList = new ArrayList<Patient>();
       }
    
       public void addPatient(Patient p){
          // adicionar o paciente à lista
          patientList.add(p);
    
          // salvar a lista num ficheiro
    
       }
    
    }
    
    
    O gestor é criado quando inicias o programa (penso eu, porque estou a assumir que é esse o objectivo do mesmo.
    Depois sempre que quiseres adicionar um tipo novo é só invocares o método addPatient no objecto manager que criaste.

    É capaz de estar um pouco confuso e com um erro ou 2 porque foi feito assim de cabeça e à pressa, mas pronto, feel free to ignore ;)
     
  11. S7sRuss

    S7sRuss What is folding?

    O código do smpme está bem feito. Quando li o teu código no inicio da página via-se logo porque é que criava novos arraylist patient. Afinal dentro do método registarPaciente() o código ArrayList<ADT> pacientes = new ArrayList<ADT> (); criava um novo arraylist de cada vez que ias adicionar um paciente. Uma lógica obviamente errada.
     
  12. Antes de mais, obrigado a todos pelas vossas respostas.

    Neste momento já consigo guardar varios registos e consigo ler todos os registos que registei no arrayList. contudo neste momento surguiu um novo problema que não consigo resolver.
    Quero criar duas funções, uma de procura por nome de paciente e outra de procura por numero de paciente.

    já criei as duas funções: axo k basta só mostrar procurar por nome:

    Código:
    static void mostraPaciente() { 
      ADT a;
      String ficheiro="HL7.dat";
      int C=numeroPacientes();
     
      geral.limparEcra();
      System.out.print("\nIndique o nome do Paciente: ");
      String nome = geral.lerLinha();
     
      try {
       FileInputStream fis = new FileInputStream(ficheiro);
       ObjectInputStream ois = new ObjectInputStream(fis);
       ArrayList f = (ArrayList) ois.readObject();
     
       for(int i=0; i<C; i++){
        ADT p1 = (ADT)f.get(i);
        if(a.PAC.nome.equals(nome)){
         apresentardados(p1);
        }
     
     
       }
     
       ois.close();   
       }
      catch (Exception e) { e.printStackTrace();
       }
     
     }

    ao compilar o programa surge-me o seguinte erro: variable a might not have been initialized e aponta para a.PAC.nome.

    este é um objecto da classe PAC que faz parte da superclasse ADT.

    Como poderei resolver o seguinte erro?

    Um bem haja a todos :D
     
  13. nasic

    nasic Power Member

    Mais uma vez nao estas a inicializar o objecto. Antes de o utilizares onde quer que seja iniciliza-o.
    Inicializar é: Object o = new Object ().

    Outra coisa que reparei:
    Nao mostraste a tua funcao que procura por numero, mas presumo que estejas a ler do ficheiro tb nessa função.
    Eu se fosse a ti não o faria pois torna o algoritmo pouco eficaz. Que tal carregares apenas uma vez? no inicio por exemplo

    É só uma ideia claro!
     
  14. Antes de mais, obrigado por teres respondido a minha mensagem.

    axo que já solucionei o meu problema, substitui o a.PAC.id por p1.PAC.nome, pois o objecto que eu quero ler encontra-se no arrayList do ficheiro binário que guardei.

    Um bem haja para ti :D
     

Partilhar esta Página