ArrayList multidimensional?

Seguinte galera!
Quero fazer um programa que pergunte 3 informações: nome, idade e cidade. Quero que o programa pegue essas informações e armazene-as de maneira que seja possivel acessar essas informações mais tarde, como se o programa fosse criando um banco de dados. Depois quero q o programa pergunte se eu quero dar informações sobre mais alguma pessoa. Caso a resposta seja sim quero que ele repita a operação até que minha resposta seja não (não quero mais dar informações sobre ninguem). Eu gostaria que voces soh me dissessem o que eu preciso fazer para conseguir fazer isso, não quero que me deem o codigo pronto. Me digam apenas melhores passos para que eu tente construir o codigo por favor. Eu acho que ainda nao tenho conhecimento para fazer esse programa simples, mas eu nao tenho certeza. Tive algumas ideias, mas nenhuma parece ser otimizada de maneira alguma.
Qual seria a maneira mais otimizada de se fazer esse programa? Eu acho que a melhor maneira seria fazer uma ArrayList de duas dimensões mas eu não sei como criar uma ArrayList em tempo de execução… :frowning:

Crie uma classe que vai conter os dados de uma pessoa, e depois crie uma array list que guarde os dados dessa pessoa.

public class Pessoa{ 
String nome;
String idade;
}
...
ArrayList<Pessoa> listaDePessoas = new ArrayList<Pessoa>();

dai para cada iteração do laço, adicione um objeto na array list através do método .add(Pessoa pessoa).

Falou

arthuraml como o Djonatah disse o melhor a ser feito é criar uma classe que ira “armazenar” as informações que
você deseja. Como a classe “Pessoa” que o Djonatah representou.
Em outra classe você cria um List para armazenar as pessoas e nesta classe você cria também a lógica como você
descreveu e cada pessoa você vai adionando na List.
Com o List você pode adicionar, remover, alterar e pesquisar qualquer objeto que estiver nele.

Abraço

isso eu tbm pensei, mas como vou criar esses os objetos da classe Pessoa dinamicamente a medida que o programa for sendo executado?
quero que a medida que eu for dando informações de mais pessoa ele vá criando objetos novos da classe Pessoa, vá armazenando as informações e adicionando os objetos na ArrayList.
como vou fazer isso?

Ué, cria os objetos com new:

[code]public class Pessoa{
public String nome;
public int idade;
public String cidade;

public Pessoa(String nome, int idade, String cidade) {
this.nome = nome;
this.idade = idade;
this.cidade = cidade;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

//Gets e sets também para cidade e idade
}[/code]

[code]public static void main(String[] args) {
List pessoas = new ArrayList();
Pessoa vinigodoy = new Pessoa(“Vinicius”, 28, “Curitiba”);
pessoas.add(vinigodoy);
Pessoa arthuraml = new Pessoa(“Arthur”, 19, “Salvador”);
pessoas.add(arthuraml);

for (Pessoa p : pessoas) {
   System.out.println("Nome: " + p.getNome());
}

}[/code]

[quote=ViniGodoy]Ué, cria os objetos com new:

[code]public class Pessoa{
public String nome;
public int idade;
public String cidade;

public Pessoa(String nome, int idade, String cidade) {
this.nome = nome;
this.idade = idade;
this.cidade = cidade;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

//Gets e sets também para cidade e idade
}[/code]

[code]public static void main(String[] args) {
List pessoas = new ArrayList();
Pessoa vinigodoy = new Pessoa(“Vinicius”, 28, “Curitiba”);
pessoas.add(vinigodoy);
Pessoa arthuraml = new Pessoa(“Arthur”, 19, “Salvador”);
pessoas.add(arthuraml);

for (Pessoa p : pessoas) {
   System.out.println("Nome: " + p.getNome());
}

}[/code][/quote]

sim, mas ai vc ta criando os objetos em tempo de compilação, n é isso q eu quero
o programa tem q pergunta o nome, idade e a cidade, criar um objeto, armazenar as informações corretamente na arraylist e depois imprimir

exemplo: (executei o programa)
(PROGRAMA) Qual o nome da pessoa?
(USUARIO) Arthur
(PROGRAMA) Qual a idade da pessoa?
(USUARIO) 20
(PROGRAMA) Qual a cidade da pessoa?
(USUARIO) Brasília

(PROGRAMA) Informações armazenadas com sucesso!
(PROGRAMA) Deseja adicionar informações de mais alguem?
(USUARIO) Não

(PROGRAMA) Deseja saber informações sobre alguem?
(USUARIO) Sim

(PROGRAMA) Digite o nome da pessoa a qual voce deseja informações?
(USUARIO) Arthur

(PROGRAMA) As informações são:
(PROGRAMA) Nome: Arthur
(PROGRAMA) Idade: 20
(PROGRAMA) Cidade: Brasília

Qual é a diferença?

[code]public static void main(String[] args) {
List pessoas = new ArrayList();
for (int i = 0; i < 10; i++) {
String nome = JOptionPane.showInputDialog(“Digite o nome”);
int idade = JOptionPane.showInputDialog(“Digite a idade”);
String cidade = JOptionPane.showInputDialog(“Digite a cidade”);
Pessoa p = new Pessoa(nome, idade, cidade);
pessoas.add§;
}

for (Pessoa p : pessoas) {
System.out.println("Nome: " + p.getNome());
}
} [/code]

Se seu programa perguntar nome, cidade, estado, sexo, cpf, rg, certidao, atestado de obito e etc…Vc nao vai ter que criar seus objetos não?!

[quote=ViniGodoy]Qual é a diferença?

[code]public static void main(String[] args) {
List pessoas = new ArrayList();
for (int i = 0; i < 10; i++) {
String nome = JOptionPane.showInputDialog(“Digite o nome”);
int idade = JOptionPane.showInputDialog(“Digite a idade”);
String cidade = JOptionPane.showInputDialog(“Digite a cidade”);
Pessoa p = new Pessoa(nome, idade, cidade);
pessoas.add§;
}

for (Pessoa p : pessoas) {
System.out.println("Nome: " + p.getNome());
}
} [/code][/quote]

mas nesse caso ele n vai estar escrevendo os objetos um em cima do outro a medida q eu for adicionando informações de mais pessoas?
quer dizer…
digamos q adicionei as informações Arthur, 20, Brasilia. e agora vou adicionar de outra pessoa. se eu quiser imprimir as informações de Arthur depois nao vou conseguir se eu fizer dessa sua forma
correto?

Amigo, o seu conceito de OO, em especial no Java, está bem fraco.
Recomendo uma boa leitura em tutoriais/apostilas para aprender como funciona.

As apostilas da Caelum tem um ótimo conteúdo didático, recomendo a leitura desta aqui em particular.

Sobre a sua pergunta, lógico que não.
Além de você estar adicionando a lista, você usa o new, ou seja, para cada informação digitada você tem um novo objeto e não sobrescreve o “antigo”.

Abraços.

brigadao!
vejo que minhas perguntas são bem bobas… desculpa galera, realmente ainda estou no começo
to lendo o Use a Cabeça! Java e o Java - Como programar (6ª Edição)

agora to vendo que eh vem obvio q os objetos não vao se sobrepor, foi mta burrice eu ter falado isso, enfim…
como eu vou fazer para acessar essas informações ja armazanadas anteriormente nos objetos?

arthuraml o código que o ViniGodoy faz o que vc falou, porém ele adiona 10 pessoas e depois
imprime as informações sobre elas.
No seu caso é só vc alterar a condição do for para quendo o usuário informar que não deseja
mais inserir pessoas.
E não se preocupe, quando a estar gravando por cima, afinal vc está trabalhando com uma
lista e nela vc vai adicionando objetos, um em cada posição. Depois basta percorrer a lista
para imprimir

[quote=kanxabd]arthuraml o código que o ViniGodoy faz o que vc falou, porém ele adiona 10 pessoas e depois
imprime as informações sobre elas.
No seu caso é só vc alterar a condição do for para quendo o usuário informar que não deseja
mais inserir pessoas.
E não se preocupe, quando a estar gravando por cima, afinal vc está trabalhando com uma
lista e nela vc vai adicionando objetos, um em cada posição. Depois basta percorrer a lista
para imprimir[/quote]

ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
tipo

System.out.println("Nome: " + p[2].getNome());

aqui ele vai imprimir o nome do terceiro objeto armazenado na minha lista

correto? ou a sintaxe esta errada?

para imprimir a lista?
isso que vc quis dizer neh?!?!

tipo

for (Pessoa p : pessoas) {    
      System.out.println("Nome: " + p.getNome());    
}  

isso é o famoso for each do Java ele percorre a lista -> pessoas
e para cada Pessoa p desta lista ele vai imprimindo

Correto, mas isso se a lista fosse com vetores.

Pessoa[]

Como a lista é do tipo ArrayList a sintaxe é:

System.out.println("Nome: " + p.get(2).getNome()); 

po brigadao galera!
eu estou começando agora Java, do zero! to estudando sozinho em casa soh com livros que baixei e mandei imprimir… os conceitos de OO ainda estão sendo incrementados ao meu cerebro, hahaha

mto diferente de C, que é oq eu estou acostumado

De forma grosseira, imagine que as classes são structs e que o new é o malloc. E que todas as variáveis que guardam objetos são ponteiros.

Seria mais ou menos essa a analogia para o C.

[code]struct Pessoa {
char* nome;
int idade;
char* cidade;
};

Considerando que exista uma função chamada lista_adicionarPessoa que recebe um ponteiro para uma pessoa e o adiciona em algum tipo de lista dinâmica:

[code]struct Pessoa *p;

for (int i = 0; i < 10; i++) {
p = malloc(sizeof(Pessoa));
p.nome = leNome();
p.idade = leIdade();
p.cidade = leCidade();
lista_adicionarPessoa§;
}[/code]

(também incluí supostas funções para a leitura, só para não ter o trabalho de escrever os printfs e scanfs).

Note que nesse código, a variável p está sendo sobrescrita, mas as structs criadas na memória não. O que o lista_adicionarPessoa recebe é um endereço de pessoa diferente a cada chamada.

O mesmo acontece naquele código java que postei.

[quote=ViniGodoy]De forma grosseira, imagine que as classes são structs e que o new é o malloc. E que todas as variáveis que guardam objetos são ponteiros.

Seria mais ou menos essa a analogia para o C.

[code]struct Pessoa {
char* nome;
int idade;
char* cidade;
};

Considerando que exista uma função chamada lista_adicionarPessoa que recebe um ponteiro para uma pessoa e o adiciona em algum tipo de lista dinâmica:

[code]struct Pessoa *p;

for (int i = 0; i < 10; i++) {
p = malloc(sizeof(Pessoa));
p.nome = leNome();
p.idade = leIdade();
p.cidade = leCidade();
lista_adicionarPessoa§;
}[/code]

(também incluí supostas funções para a leitura, só para não ter o trabalho de escrever os printfs e scanfs).

Note que nesse código, a variável p está sendo sobrescrita, mas as structs criadas na memória não. O que o lista_adicionarPessoa recebe é um endereço de pessoa diferente a cada chamada.

O mesmo acontece naquele código java que postei.[/quote]

nossa vinicius brigadao!!

olha oq montei ateh agora

import java.util.ArrayList;
import javax.swing.*;
import java.util.Scanner;

class Pessoa{
	private String name;
	private int idade;
	private String cidade;

	public Pessoa(String name, int idade, String cidade) {
		this.name = name;
		this.idade = idade;
		this.cidade = cidade;
	}
}

public class Info {
	public static void main(String args[]) {
		int n = Integer.parseInt(JOptionPane.showInputDialog("Deseja adicionar informacoes de quantas pessoas? "));
		int x;
		ArrayList<Pessoa> listaInfo = new ArrayList<Pessoa>();
		for (x=0; x<n; x++) {
			String name = JOptionPane.showInputDialog("Digite o nome da "+(x+1)+"ªpessoa: ");
			int idade = Integer.parseInt(JOptionPane.showInputDialog("Digite a idade: "));
			String cidade = JOptionPane.showInputDialog("Digite a cidade: ");
			Pessoa p = new Pessoa(name, idade, cidade);
		}
	}
}

jaja eu termino :D>

public class Info {
	public static void main(String args[]) {
		int n = Integer.parseInt(JOptionPane.showInputDialog("Deseja adicionar informacoes de quantas pessoas? "));
		int x;
		String sn = new String("sim");
		ArrayList<Pessoa> listaInfo = new ArrayList<Pessoa>();
		do {
			for (x=0; x<n; x++) {
				String name = JOptionPane.showInputDialog("Digite o nome da "+(x+1)+"ªpessoa: ");
				int idade = Integer.parseInt(JOptionPane.showInputDialog("Digite a idade: "));
				String cidade = JOptionPane.showInputDialog("Digite a cidade: ");
				Pessoa p = new Pessoa(name, idade, cidade);
			}
			sn = JOptionPane.showInputDialog("Deseja adicionar informações de mais pessoas?");
			if (sn == "sim") {
				System.out.println("ENTROU"); // PQ NAO ESTA ENTRANDO NESTE LAÇO IF?
				//n = Integer.parseInt(JOptionPane.showInputDialog("Deseja adicionar informacoes de quantas pessoas? "));
			}
		} while (sn == "sim");
	}
}

pq não ta entrando no meu laço if quando eu escrevo “sim”?

tentei usar sn.compareTo(“sim”) > 0 e tbm n deu certo

ai usei:

sn.equals(“sim”)

e deu certo

pq?