Manipulando vetor de objetos

25 respostas
gRoOve

Ae galera do GUJ, estou iniciando em Java e to com uma dificuldade nessa classe, consigo cadastrar o primeiro objeto, mas quando passa pro segundo na hora de entrar os dados ele pula o nome, não deixa eu digitar e vai direito pro campo idade já, pq isso?

Outra coisa, eu criei o vetor dos objetos dentro da classe Cadastro, ta certo fazer assim ou teria que criar o vetor dentro do método main e ai chamar a classe.função(objeto)

import java.util.Scanner;

public class Cadastro {
	private int max = 100;
	private int i = 0;

	
	Scanner s = new Scanner(System.in);
	Pessoa[] pessoa = new Pessoa[100];
	
	//Metodos
	public void cadastrar()
	{
		pessoa[i] = new Pessoa();
		System.out.println("Nome: ");
		pessoa[i].setNome(s.nextLine());
		
		System.out.println("Idade: ");
		pessoa[i].setIdade(s.nextInt());
		
		System.out.println("CPF: ");
		pessoa[i].setCpf(s.nextInt());
		
		i++;
	}
	
	public void excluir()
	{
		
	}
	
	public void exibir()
	{
		System.out.println("Nome: " + pessoa[i-1].getNome());
		System.out.println("Idade: " + pessoa[i-1].getIdade());
		System.out.println("CPF: " + pessoa[i-1].getCpf());
	}
}

25 Respostas

K

aonde vc está chamando o método pessoa?
porque pelo código ele está sempre usando a posição 0 do vetor

F

Amigo, qual IDE você utiliza? já sabe contruir telas com swing?
tente colocar o i++ antes de pessoa[i] = new Pessoa(); , para adicionar antes de fazer o cadastro

i++; 

    pessoa[i] = new Pessoa();   
    System.out.println("Nome: ");   
    pessoa[i].setNome(s.nextLine());   
       
    System.out.println("Idade: ");   
    pessoa[i].setIdade(s.nextInt());   
       
    System.out.println("CPF: ");   
    pessoa[i].setCpf(s.nextInt());
thiagofesta

ESQUECE O QUE DIGITEI!

gRoOve

Pessoa é uma clase. Vou declarar a estrutura, tenho 4 classes: principal(método main), Pessoa, Endereco e Cadastro. Pois bem, dentro da classe principal, eu criei um objeto do classe Cadastro, através de um menuzinho e talz chamo a função cadastrar(). Mas não tem a variável ‘i’ usada pra incrementar ali? Ou a cada chamada da classe Cadastro ela(a variável) é iniciada com 0?

Estou usando o Eclipse. Não sei mecher com swing ainda.

Olha o enunciado do exercício: [b]Implemente uma classe que simule um cadastro de pessoal. Esta classe deve armazenar até 100 pessoas (utilize a classe Pessoa) com seus respectivos endereços. Esta classe deve ter os seguintes comportamentos: permitir o cadastramento e exclusão de pessoas do cadastro.[

thiagofesta

gRoOve:
Pessoa é uma clase. Vou declarar a estrutura, tenho 4 classes: principal(método main), Pessoa, Endereco e Cadastro. Pois bem, dentro da classe principal, eu criei um objeto do classe Cadastro, através de um menuzinho e talz chamo a função cadastrar(). Mas não tem a variável ‘i’ usada pra incrementar ali? Ou a cada chamada da classe Cadastro ela(a variável) é iniciada com 0?

Estou usando o Eclipse. Não sei mecher com swing ainda.

Olha o enunciado do exercício: [b]Implemente uma classe que simule um cadastro de pessoal. Esta classe deve armazenar até 100 pessoas (utilize a classe Pessoa) com seus respectivos endereços. Esta classe deve ter os seguintes comportamentos: permitir o cadastramento e exclusão de pessoas do cadastro.[

Depende de como você chamar o método cadastra!!!
passa onde você chama o método cadastra ai.

gRoOve

Segue o metodo principal(está nomeado como teste…)

import java.util.Scanner;

public class teste {
	public static void main(String[] args) {
		Cadastro cadastro = new Cadastro();
		//Pessoa[] pessoa = new Pessoa[100];
		Scanner s = new Scanner(System.in);
		int opcao;
		
		do
		{
			System.out.println();
			System.out.println("Programa de Cadastro");
			System.out.println("1 - Cadastrar");
			System.out.println("2 - Exlcuir");
			System.out.println("3 - Exibir");
			System.out.println("4 - Sair");
			opcao = s.nextInt();
			
			switch(opcao)
			{
				case 1:
					cadastro.cadastrar();
					break;
				case 2:
					cadastro.excluir();
					break;
				case 3:
					cadastro.exibir();
					break;
				case 4:
					System.exit(0);
				default:
					System.out.println("Opcao Invalida!");
			}
		}while(opcao != 4);
	}
}
thiagofesta

chama assim cadastro.cadastrar(s);

no método seu la, coloca public void cadastrar(Scanner s)

e deleta o atributo S da classe Cadastro

e me diga se deu certo!

gRoOve

Não deu certo não…qual a função de passar ‘s’ ai?
Tipo quando vou entrar os dados, passa direito o nome, vai direto pra idade…eu programo em C, diria que tem algum lixo ali, hasuesahue
O problema é esse mesmo, a variável incrementa pro próximo objeto e talz, mas passa reto…

thiagofesta

eu acho que é o Scanner...

tente assim:
switch(opcao)  
             {  
                 case 1:  
                     cadastro.cadastrar(s);  
                     break;  
                 case 2:  
                     cadastro.excluir();  
                     break;  
                 case 3:  
                     cadastro.exibir();  
                     break;  
                 case 4:  
                     System.exit(0);  
                 default:  
                     System.out.println("Opcao Invalida!");  
             }

E

// Scanner s = new Scanner(System.in); ESSE ATRIBUTO TEM QUE SER REMOVIDO!!!!

public void cadastrar(Scanner s)  
     {  
         pessoa[i] = new Pessoa();  
         System.out.println("Nome: ");  
         pessoa[i].setNome(s.nextLine());  
           
         System.out.println("Idade: ");  
         pessoa[i].setIdade(s.nextInt());  
           
         System.out.println("CPF: ");  
         pessoa[i].setCpf(s.nextInt());  
           
         i++;  
     }

Tenta ai e me avisa!

gRoOve

Foi exatamente assim que fiz, dessa forma já passa direito no primeiro objeto, do jeito que eu tava fazendo conseguia incluir o primeiro objeto e passava reto no segundo…

thiagofesta

Tem como anexar um .rar dos arquivos?
ou só dos arquivos .java já ajuda.

Kura

Eu não entendi o pq do vetor de objetos pessoa.
A sua classe de cadastro não cadrastaria uma pessoa de cada vez?

Kura

Arf. Mandei 2 vezes a mesma msg. Não tem como apagar msg não?

gRoOve

Vejam esse link http://www.guj.com.br/posts/list/77982.java, era o maldito problema de buffer do C mesmo =((

Kura, minha classe cadastro cadastra um por vez, mas preciso limitar a quantidade de objetos em 100…se declarasse no método main teria que passar pela função o objeto né? Sou novo em OOP, não tenho muita noção de como as coisas ficam melhor…O que vc sugere?

Kura

Você não precisa limitar nada.
A classe Cadastro vai ser chamada quando uma pessoa estiver montada. Então, a classe vai fazer um único cadastro.
Depois que o cadastro for concluido, o programa acaba.
Quando outra pessoa for se cadastrar, o programa vai rodar todo de novo.
Só faria sentido esse vetor se vc fosse montar 100 pessoas antes de cadastrar.
Ou seja, todas as 100 pessoas digitariam seus dados e, só quando o número (100) fosse atingido é que o cadastro seria feito.
Não faz sentido, né?

Espero que tenha ajudado!

Kura

E caso vc quisesse montar as 100 pessoas antes do cadastro, você teria que percorrer esse vetor para cadastrar cada pessoa. Se não, como vc conseguiria enxergar cada uma? Você só enxergaria a primeira.

gRoOve

Mas digamos que eu queira cadastrar 10 pessoas, não tenho que ter 10 objetos? Consequentemente um array de objetos?

Kura

Então… depende.
Se quiser cadastrar as 10 ao mesmo tempo sim.

Mas ai seu programa teria que funcionar da seguinte maneira:

Uma pessoa digita o nome e a idade.
Logo em seguida, outra pessoa teria que digitar também o nome e a idade (isso sem o programa finalizar, sem fazer nada. de maneiras seguidas mesmo. depois da primeira pessoa digitar a idade, a segudna digita o nome e a idade)
E assim por diante.

Depois que 10 pessoas tiverem feito isso, ai sim que o programa vai cadastrar.

O certo não seria uma pessoa digitar os dados e ser cadastrada em seguida para, depois, outra pessoa se cadastrar?
Se sim, então não precisamos de vetor visto que cada cadastro será feito separadamente.

gRoOve

Mas veja o que o exercício pede:

13.Implemente uma classe que simule um cadastro de pessoal. Esta classe deve armazenar até 100 pessoas (utilize a classe Pessoa) com seus respectivos endereços. Esta classe deve ter os seguintes comportamentos: permitir o cadastramento e exclusão de pessoas do cadastro.

E como vou guardar os dados de 10 pessoas dentro de um objeto apenas? Como vou recuperar os dados das 10 pessoas depois?

Kura

Caso ninguem responda até la, a noite, se eu tiver tempo, entro na internet e pego o exercicio direito contigo.
Ai, se você quiser, a gente discute melhor por msn ou algo do tipo.

thiagofesta

gRoOve:
Vejam esse link http://www.guj.com.br/posts/list/77982.java, era o maldito problema de buffer do C mesmo =((

Kura, minha classe cadastro cadastra um por vez, mas preciso limitar a quantidade de objetos em 100…se declarasse no método main teria que passar pela função o objeto né? Sou novo em OOP, não tenho muita noção de como as coisas ficam melhor…O que vc sugere?

Dentro da classe Cadastro a classe Pessoa que foi instânciada está correta.
Pode ser dessa forma. acredito que seja a melhor, se passar como parâmetro daria na mesma, ai instânciava na classe teste, e passava no contrutor da classe Cadastro, ai pegava do contrutor e joga em seus atributos, mas dessa forma, nesse caso, é pior.

gRoOve

Então vou deixar da forma mais fácil, a classe Pessoa sendo instânciada dentro da classe Cadastro, até aí consigo entrar com os dados e armazenar na sua devida posição dentro do array. Agora, como faço com a classe Endereco? Tenho que instância-lá dentro da classe Cadastro também? Criar um array como a classe Pessoa?

Olhem como eu fiz:

import java.util.Scanner;

public class Cadastro {
	
	private int cont = 0; //Conta a quantidade de registros
	final int MAX = 2;
	
	Scanner s = new Scanner(System.in);
	Pessoa[] pessoa = new Pessoa[MAX];
	Endereco[] endereco = new Endereco[MAX];
	
	//Metodos
	public void cadastrar()
	{
		if(cont == MAX) return;
		
		pessoa[cont] = new Pessoa(); //Instanciar o objeto pessoa referente a posição cont do array
		endereco[cont] = new Endereco(); //Instanciar o objeto endereco referente a posição cont do array
		
		System.out.println("Nome: ");
		pessoa[cont].setNome(s.nextLine());
		
		System.out.println("Idade: ");
		pessoa[cont].setIdade(s.nextInt());
		
		System.out.println("CPF: ");
		pessoa[cont].setCpf(s.nextInt());
		
		s.nextLine();//Pega o buffer do teclado
		System.out.println("Rua: ");
		endereco[cont].setRua(s.nextLine());
		
		pessoa[cont].setEndereco(endereco[cont]);
		cont++;
	}
	
	public void excluir()
	{
		String nome;
		System.out.println("Digite o nome que deseja exlcuir: ");
		nome = s.nextLine();
		for(int i=0; i<cont; i++)
		{
			if(nome.equals(pessoa[i].getNome()))
				pessoa[i].setNome(null);
		}
	}
	
	public void exibir()
	{
		for(int i=0; i<cont; i++)
		{
			if(! (pessoa[i].getNome().equals(null)) )
			{
				System.out.println("Nome: " + pessoa[i].getNome());
				System.out.println("Idade: " + pessoa[i].getIdade());
				System.out.println("CPF: " + pessoa[i].getCpf());
				System.out.println("Rua: " + pessoa[i].getEndereco().getRua());
				System.out.println("");
			}
		}
	}
}

Só uma dúvida na função exibir(), quero comprar o conteudo do nome com null, mas essa função não tá dando certo. Como eu faria ali?

thiagofesta

Para comparar com null faça:

if(pessoa[i].getNome() != null){...}
thiagofesta
Na classe pessoa que deveria estar o endereço, algo assim:
public class Pessoa
{

	private Endereco endereco; // Uma pessoa irá ter apenas 1 endereço? se for assim está certo
	// E todos os atributos aqui

}

Dessa forma eu falo que a Pessoa possui um endereço, a cada cadastro o objeto Pessoa será preenchido, sendo assim, irá ter o endereço daquela pessoa...

Caso surgir dúvidas ao cadastrar o endereço dessa forma, faça assim:
public class Pessoa
{

	private Endereco endereco; // Uma pessoa irá ter apenas 1 endereço? se for assim está certo
	// E todos os atributos aqui
	
	public Endereco getEndereco()
	{
		return this.endereco;
	}

}
ai onde está assim:
System.out.println("Rua: ");  
endereco[cont].setRua(s.nextLine());
use dessa forma:
System.out.println("Rua: ");  
pessoa[cont].getEndereco().setRua(s.nextLine());
gRoOve

Tipo, como vc viu no meu código ali, primeiro eu atribui os valores ao objeto endereco, depois coloquei-o dentro do objeto pessoa.

Porém eu tentei assim:

System.out.println("Rua: ");    
pessoa[cont].getEndereco().setRua(s.nextLine());

E não deu certo não. O encapsulamento com set e get, pra acessar Endereco está feito na classe Pessoa.

Criado 11 de março de 2009
Ultima resposta 12 de mar. de 2009
Respostas 25
Participantes 5