[Resolvido] - Array List

12 respostas
mauraoemau

Olá pessoal estou tentando fazer um sistema com arraylist mas não esta funcionado onde estou errando.

Menu

import java.util.*;
import java.io.*;

public class Menu {

    public static void main(String args[]){
        
        //Atributos
        int op;
        
        //Objeto
        Rg rg = new Rg();
        
         //Objeto para arraylist
        ArrayList<Rg> cadastro = new ArrayList<Rg>();
    
        //Objeto Scanner
        Scanner entra = new Scanner(System.in);
        
        //Loop
        do{
            //Menu
            System.out.println("1 - Cadastro");
            System.out.println("2 - Sair");
            System.out.println("Entre com opção deejada:");
            op = entra.nextInt();
            
            //Escolhas
            switch(op){
                
                case 1:
                    rg.Menu();
                    cadastro.add(rg);
            }
            
        }while(op != 2);
        
    }
}

Contatos

import java.util.*;
import java.io.*;

public abstract class Contatos {

    public String Nome;
    
    public void Entrada()
    {
        Scanner entra = new Scanner(System.in);
        
        System.out.println("Entre com o nome");
        Nome = entra.next();
    }
    
    public void Mostra()
    {
        System.out.println("O nome e:"+Nome);
    } 
}

Rg

import java.util.*;
import java.io.*;

public class Rg extends Contatos {

    public int Rg;
    
    public void Entrada(){
        super.Entrada();
        
        Scanner entra = new Scanner(System.in);
        
        System.out.println("Entre com Rg:");
        Rg = entra.nextInt();
    }
    
    public void Mostra(){
        super.Mostra();
        
        System.out.println("O Rg:"+Rg);
    }
    
    public void Menu()
    {
        int op;
        
        Scanner entra = new Scanner(System.in);
        
        //Objeto
        Rg rg = new Rg();
        
         //Objeto para arraylist
        ArrayList<Rg> cadastro = new ArrayList<Rg>();
        
        do{
            System.out.println("1 - Incluir");
            System.out.println("2 - Mostrar");
            System.out.println("3 - Voltar");
            System.out.println("Entre com a opção:");
            op = entra.nextInt();  

            switch(op){

                case 1:
                    Entrada();
                    break;
                   
                case 2:
                    for(int i=0; i< cadastro.size(); i++){
                        //Exibe na tela
                        System.out.printf("%15s",cadastro.get(i));
                    }
                    break;
                   
            }
        }while(op != 3);
    }
}

12 Respostas

blackfalcon

Bem, eu comecei agora a utilizar List e estou aprendendo ainda, falar verdade nem sei se a maneira que estou fazendo é a melhor.

Mas, ao inves de:

ArrayList list = new ArrayList();

Tente:

List list = new ArrayList();

Quando utilizei assim, funcionou!

Veja isso:

http://www.guj.com.br/posts/list/206790.java

Abraços

ViniGodoy

Essa declaração é mesmo melhor. Mas a correta é assim:

List<Tipo> list = new ArrayList<Tipo>();
edmarr

Essa declaração é mesmo melhor. Mas a correta é assim:

List<Tipo> list = new ArrayList<Tipo>();

Deste modo vc ja estara iniciando o conceito de genéricos ,
muito poderoso para sistemas grandes e robustos.

Lembrando sempre que possivel utilize uma interface pra declarar um determinado tipo,
pois assim vc estaria criando um baixo acoplamento =´) .

mauraoemau

No caso na hora da exibição exibe apenas um cadastro.

Alterei o código para:

case 2:
                    for(int i=0; i< cadastro.size(); i++){  
                          //Exibe na tela  
                          cadastro.get(i).Mostra();  
                     }  
                    break;

Mas mesmo assim exibe apenas um registro.No caso parece que ele esta se sobrepondo.

tauame

olá, se quiseres usar System.out.printf("%15s",cadastro.get(i)); para imprimir a resposta, então você deverá criar o método toString() dentro da classe Rg…

o método deve ficar assim(eu acho):

public String toString(){ return Integer.toString(Rg); }

o método toString() serve para quando você quiser “imprimir” algum objeto, utilizando esse método você define o que será impresso… assim você não precisa fazer um System.out.println(Rg.Rg); (observe ainda que para esse código funcionar, o atributo Rg precisa ser público). Usando o toString(), basta fazer System.out.println(Rg); (agora o atributo Rg pode ser privado, pois estamos apenas acessando o método toString), e o não é necessário fazer uma chamada explícita deste método, a classe já chama ele automaticamente no momento que o programa tenta imprimir o objeto.

PS.: utiliza a primeira letra maiuscula apenas para nomear Classes, pois métodos e atributos devem possuir a primeira letra minúscula, deixando maiúscula apenas as primeiras letras das próximas palavras, caso o nome do objeto tenha mais de uma palavra. utilize boas práticas de programação.

Ex. de atributos e métodos:

registro;

registroGeral;

cadastrarRegistro();

mostrar();

mostrarRegistroGeral();

:wink:

mauraoemau

No caso não esta mostrando erro mais sim esta mostrando apenas um registro cadastrado.

E quando eu volto para menu principal e retornon novamente para menu da classe “rg” e escolho a opção mostra.

Todos os registros estão null.

mauraoemau

Bom Welligton como sou novato nisso então o que eu faria para corrigir esse erro.
Ja abusando da ajuda.

mauraoemau

Conseguiu resolver cara valeu mesmo.

WellingtonRamos

mauraoemau
Qual exatamente é o erro? (não testei seu código)?

//Acho que o problema pode estar aqui: System.out.printf("%15s",cadastro.get(i)); //Altere para System.out.printf("%15s",cadastro.get(i).Rg); //Ou cadastro.get(i).Mostra();

Seria bom usar algumas convenções: nome de variavel e de método iniciando com letra minúscula. Iniciando com letra maiúscula, apenas nome de classes.
Isso ajuda bastante no entendimento :wink:

Quanto a usar List list = new ArrayList() ou ArrayList list = new ArrayList(), o resultado final TEM que ser o mesmo para o seu código, ou seja, não precisa mudar. (edit: Apesar de ser conveniente o uso List list = …).

WellingtonRamos

mauraoemau:
No caso na hora da exibição exibe apenas um cadastro.

Alterei o código para:

case 2:
                    for(int i=0; i< cadastro.size(); i++){  
                          //Exibe na tela  
                          cadastro.get(i).Mostra();  
                     }  
                    break;

Mas mesmo assim exibe apenas um registro.No caso parece que ele esta se sobrepondo.


Que tal colocar o que está imprimindo? Assim talvez fique mais claro qual o erro…

WellingtonRamos

mauraoemau:
No caso não esta mostrando erro mais sim esta mostrando apenas um registro cadastrado.

E quando eu volto para menu principal e retornon novamente para menu da classe “rg” e escolho a opção mostra.

Todos os registros estão null.

Ah tá…
O problema está no momento que vc está criando o teu ArrayList

Há uma instancia de Cadastro criada localmente no método Menu (que é criada toda vez que o método é chamado perdendo os dados já adicionados) e outra no main (que não recebe valores novos).

WellingtonRamos

mauraoemau:
Bom Welligton como sou novato nisso então o que eu faria para corrigir esse erro.

Começe removendo a parte onde vc cria a variável cadastro de dentro de método menu.
Vc ainda precisa de alguma outra lista e você a criou no main. Deve utilizar alguma forma de fazê-la ser utilizada dentro do método menu. (como vc está abusando da ajuda, estou fazendo vc pensar :wink: )

Criado 14 de maio de 2010
Ultima resposta 17 de mai. de 2010
Respostas 12
Participantes 6