Acessar list[resolvido]

17 respostas
denisspitfire

Porque não consigo acessar a list?

public class Teste {
	public static List criaLista() {
		List<Objeto> lista = new ArrayList<Objeto>();
		lista.add(criaObjeto("nome1", "endereço1", 1));
		lista.add(criaObjeto("nome2", "endereço2", 2));
		lista.add(criaObjeto("nome3", "endereço3", 3));
		lista.add(criaObjeto("nome4", "endereço4", 4));
		lista.add(criaObjeto("nome5", "endereço5", 5));
		
		return lista;
	}

	public static Objeto criaObjeto(String nome, String endereco, int idade) {

		Objeto objeto = new Objeto();
		objeto.setNome(nome);
		objeto.setEndereco(endereco);
		objeto.setIdade(idade);

		return objeto;
	}

	public static void imprimeTudo(List lista) {
		for (int i = 0; i < lista.size(); i++) {
			System.out.print(lista.get(i).getNome()+" ");
			System.out.print(lista.get(i).getEndereco()+" ");
			System.out.println(lista.get(i).getIdade());
		}
	}

	public static void main(String[] args) {
		System.out.println("iniciando");
		List lista  = criaLista();
		imprimeTudo(lista);
		System.out.println("finalizou");
	}
}

17 Respostas

Gleidson_Henrique

Para listar nao é assim…

Voce deve usar um for e fazer ele percorrer atraves do metodo get.

public static void main(String[] args) { System.out.println("iniciando"); List lista = criaLista(); //imprimeTudo(lista); //troque isso por - nao lembro se é size ou lenght, de uma conferida por favor... for(int i = 0; i < lista.size(); i+){ System.out.println(lista.get(i)); } System.out.println("finalizou"); }

Rodrigo_Sasaki

Como assim não consegue acessar? O que acontece?

denisspitfire

Aahhh consegui!!
porém… se eu coloquei na list só Objetos… Porque tenho que fazer um cast?

public static void imprimeTudo(List lista) {
		for (int i = 0; i < lista.size(); i++) {
			Objeto atual  = (Objeto) lista.get(i);
			System.out.print(atual.getNome()+" ");
			System.out.print(atual.getEndereco()+" ");
			System.out.println(atual.getIdade());
		}
	}

nao poderia ser

Objeto atual = lista.get(i);
Rodrigo_Sasaki

seu método não recebe uma lista tipada. altere isso:public static void imprimeTudo(List lista) { para isso:public static void imprimeTudo(List<Objeto> lista) {

denisspitfire

Como assim não consegue acessar? O que acontece?

Ah cara uma pegadinha do malandro só pode!

muito estranho eu nao poder fazer isso

System.out.print(lista.get(i).getNome()+" ");

ja começa por aqui. Pois nao posso acessar o metodo do objeto “i”. Why? pq a get precisa retornar algo?

e depois nao posso simplesmente jogar um .get da lista sendo que tudo oque tem la é da classe Objeto e a variavel que eu quero jogar é Objeto também!

Objeto atual  = (Objeto) lista.get(i);

tem que dar cast… why??

denisspitfire

PERFECT!

Rodrigo_Sasaki

Seu método não tem como saber que a List que ele recebe é um List de Objeto se você não definir tipo no parâmetro.

os tipos “desaparecem” após a compilação por causa do erasure de generics, então se você não definir, ele vai assumir que é uma lista de Object.

Ruttmann

Como assim não consegue acessar? O que acontece?

Ah cara uma pegadinha do malandro só pode!

muito estranho eu nao poder fazer isso

System.out.print(lista.get(i).getNome()+" ");

ja começa por aqui. Pois nao posso acessar o metodo do objeto “i”. Why? pq a get precisa retornar algo?

e depois nao posso simplesmente jogar um .get da lista sendo que tudo oque tem la é da classe Objeto e a variavel que eu quero jogar é Objeto também!

Objeto atual  = (Objeto) lista.get(i);

tem que dar cast… why??

Tem que dar cast pois no seu método imprimeTudo você apenas declarou que o mesmo deve receber uma lista como parâmetro, mas não colocou o Generics indicando ao mesmo que ele só deve aceitar Lists de Object.

E como você não refinou esse parâmetro, ele vai receber a lista mas não vai se importar com o conteúdo dela. Portanto, ou você indica na referência ou indica no momento de capturar o objeto em questão.

Quando você não declarou o que viria dentro da suposta lista que o método recebeu por parâmetro, o método assumiu a situação de que poderia encontrar qualquer tipo de coisa dentro da lista. Desde Objects até valores primitivos…

Rodrigo_Sasaki

Ruttmann:


Quando você não declarou o que viria dentro da suposta lista que o método recebeu por parâmetro, o método assumiu a situação de que poderia encontrar qualquer tipo de coisa dentro da lista. Desde Objects até valores primitivos…

Não existe List de tipos primitivos em Java, se ele não definir um tipo, ele simplesmente está trabalhando com um List de Object.

denisspitfire

perfeito!
é tudo pelo motivo de que eu recebi “errado” e nao tipei a lista. Com a lista tipada eu posso fazer também o System.out.print(lista.get(i).getNome()+" ");

Ruttmann

digaoneves:
Ruttmann:


Quando você não declarou o que viria dentro da suposta lista que o método recebeu por parâmetro, o método assumiu a situação de que poderia encontrar qualquer tipo de coisa dentro da lista. Desde Objects até valores primitivos…

Não existe List de tipos primitivos em Java, se ele não definir um tipo, ele simplesmente está trabalhando com um List de Object.

Tem razão, falei abobrinha acima. :lol:

denisspitfire

o ruim deve ser pra debugar um troço desses

System.out.print(lista.get(i).getNome()+" ");

digamos com um exemplo mais complicado. Vai ser chato de arrumar nao é?

Mas ai vem a pergunta. Debug melhor ou performance melhor?

Porque se eu escrever direto e não criar um objeto atual pra depois usa-lo, vai ficar mais rapido certo?

Rodrigo_Sasaki

denisspitfire:
o ruim deve ser pra debugar um troço desses

System.out.print(lista.get(i).getNome()+" ");

digamos com um exemplo mais complicado. Vai ser chato de arrumar nao é?

Mas ai vem a pergunta. Debug melhor ou performance melhor?

Porque se eu escrever direto e não criar um objeto atual pra depois usa-lo, vai ficar mais rapido certo?

Que? Não entendi o que você quis dizer, cara.

denisspitfire
System.out.print(lista.get(i).getNome()+" ");

X

Objeto atual = lista.get(i);
System.out.print(atual.getNome()+" ");

Primeiro que. O de cima deve ser mais rapido por acessar direto ao inves de criar um objeto (Objeto atual) e depois pegar o nome dele na linha de baixo.
até ai ok.

Porém eu acho que fica ruim de ler, e fica péssimo para debugar. Porque?
exemplo é o Jquery.

“erro na linha 74.”

dai quando voce vai na linha 74 esta uma zona pq ele tem muitos acessos com “.”

Oque acham? Existem boas práticas pra isso ou estou exagerando?

Rodrigo_Sasaki

Variáveis locais impactam pouquíssimo no processamento, se é que impacta alguma coisa.

prefira legibilidade de código.

leia essa resposta: http://www.guj.com.br/java/277683-problema-com-loop#1462477

denisspitfire

vlw

S

denisspitfire:
System.out.print(lista.get(i).getNome()+" ");
X

Objeto atual = lista.get(i);
System.out.print(atual.getNome()+" ");

Primeiro que. O de cima deve ser mais rapido por acessar direto ao inves de criar um objeto (Objeto atual) e depois pegar o nome dele na linha de baixo.
até ai ok.

Porém eu acho que fica ruim de ler, e fica péssimo para debugar. Porque?
exemplo é o Jquery.

“erro na linha 74.”

dai quando voce vai na linha 74 esta uma zona pq ele tem muitos acessos com “.”

Oque acham? Existem boas práticas pra isso ou estou exagerando?

Você pode usar o enhanced for.

for(Objeto o : lista) {
       System.out.print(o.getNome() + " ");
     //Resto do código
}
Criado 21 de setembro de 2012
Ultima resposta 21 de set. de 2012
Respostas 17
Participantes 5