Pegar valor de um ArrayList();

Fala galera, entaum naum sei oq pode ser q esta dando de errado, eu estava fazendo td usando vetor de Strings, ai mudei para List, soh q naum to conseguindo resgatar oq eu passo para a Lista…
vejam:

import java.util.ArrayList;

class Palavras{
	
	private ArrayList arPalavra = new ArrayList();   
	private ArrayList arDica    = new ArrayList();
	

	public void setPalavra(String sNovaPalavra){
		this.arPalavra.add(sNovaPalavra);
	}

	public String getPalavra(int iIndice){
		return this.arPalavra.get(iIndice);
	}
	
	public void setDica(String sNovaDica){
		this.arDica.add(sNovaDica);
	}
	
	public String getDica(int iIndice){
		return this.arDica.get(iIndice);
	}

}

Desculpe c for algo simples, éq to iniciando em Java ainda ;D

Tente

private List<String> arPalavra = new ArrayList<String>();

Outra coisa. Não costumo inicializar os atributos na própria declaração e sim no construtor. Não sei qual é a melhor prática.

Abraços

Seu ArrayList retorna um Object. Você tem 2 alternativas para isso:

  1. Se você está usando Java 5 ou mais, você pode explicitar o tipo da lista, para que ao invés de um Object, ela trabalhe com String:

[code]
import java.util.List;
import java.util.ArrayList;

class Palavras{

private List<String> arPalavra = new ArrayList<String>();   
private List<String> arDica    = new ArrayList<String>();


public void setPalavra(String sNovaPalavra){
	this.arPalavra.add(sNovaPalavra);
}

public String getPalavra(int iIndice){
	return this.arPalavra.get(iIndice);
}

public void setDica(String sNovaDica){
	this.arDica.add(sNovaDica);
}

public String getDica(int iIndice){
	return this.arDica.get(iIndice);
}

}[/code]

  1. Se você estiver usando uma versão anterior ao Java 5, você deve fazer cast no retorno:

[code]
import java.util.List;
import java.util.ArrayList;

class Palavras{

private List arPalavra = new ArrayList<String>();   
private List arDica    = new ArrayList<String>();


public void setPalavra(String sNovaPalavra){
	this.arPalavra.add(sNovaPalavra);
}

public String getPalavra(int iIndice){
	return (String)this.arPalavra.get(iIndice);
}

public void setDica(String sNovaDica){
	this.arDica.add(sNovaDica);
}

public String getDica(int iIndice){
	return (String)this.arDica.get(iIndice);
}

}[/code]

Agora, independente da versão de java que você estiver usando, sempre use os Lists através da interface list (como no exemplo), e não através da classe ArrayList direto.

Esses tópicos podem te ajudar a entender melhor esses conceitos:
http://www.guj.com.br/posts/list/74068.java#389435
http://www.guj.com.br/posts/list/55387.java#290673

Opa brigadão compilo aki ;D!
é q eu uso o compilador online, pq no trampo num vo instalar o JCreator neh hehe…
sobre o construtor vc me sugere algo assim:

import java.util.ArrayList;

class Palavras{
	
	public Palavras(){
		private ArrayList<String> arPalavra = new ArrayList<String>();   
		private ArrayList<String> arDica    = new ArrayList<String>();
	}

	public void setPalavra(String sNovaPalavra){
		this.arPalavra.add(sNovaPalavra);
	}

	public String getPalavra(int iIndice){
		return this.arPalavra.get(iIndice);
	}
	
	public void setDica(String sNovaDica){
		this.arDica.add(sNovaDica);
	}
	
	public String getDica(int iIndice){
		return this.arDica.get(iIndice);
	}

}

[]'s

A vantagem de inicializar os atributos diretamente é que a inicialização vale para os vários construtores.

Agora, se vc tiver uma preocupação realmente crítica com performance, isso pode significar que alguns construtores irão inicializar o atributo 2 vezes (por exemplo, um construtor que receba o valor do list por parâmetro irá fazer a inicialização padrão, e depois reiniciar a variável com o valor do parâmetro).

Eu não tenho uma regra formal sobre isso, geralmente prefiro o que deixa o código mais fácil de ler. Se muitos atributos devem ser inicializados no construtor, as vezes movo a inicialização de outros para o construtor também.

Nope.

Assim:

import java.util.ArrayList;  
  
class Palavras{
  private ArrayList<String> arPalavra;

  public Palavras(){
     arPalavra = new ArrayList<String>();
  }
}

Não, a sugestão dele é assim:

[code]import java.util.List;
import java.util.ArrayList;

class Palavras{
private List arPalavra;
private List arDica;

public Palavras{
arPalavra = new ArrayList();
arDica = new ArrayList();
}

public void setPalavra(String sNovaPalavra){
this.arPalavra.add(sNovaPalavra);
}

public String getPalavra(int iIndice){
return this.arPalavra.get(iIndice);
}

public void setDica(String sNovaDica){
this.arDica.add(sNovaDica);
}

public String getDica(int iIndice){
return this.arDica.get(iIndice);
}
}[/code]

a entendi vc quis dizer na hr de instanciar…

bom galera vlw msm entendi td q foi passado (Y);

A vantagem de inicializar os atributos diretamente é que a inicialização vale para os vários construtores.

Agora, se vc tiver uma preocupação realmente crítica com performance, isso pode significar que alguns construtores irão inicializar o atributo 2 vezes (por exemplo, um construtor que receba o valor do list por parâmetro irá fazer a inicialização padrão, e depois reiniciar a variável com o valor do parâmetro).

Eu não tenho uma regra formal sobre isso, geralmente prefiro o que deixa o código mais fácil de ler. Se muitos atributos devem ser inicializados no construtor, as vezes movo a inicialização de outros para o construtor também.[/quote]

Entendi. Mas e no caso dos atributos com tipos primitivos? Você também usa a abordagem de inicialização na declaração?

Tipo:

private int foo = 0;

Valeu Vini!

ops, outra coisa, na hr da leitura c o usuario da enter sem ter digitado nd, o programa finaliza e reclama um montão, gostaria de saber como tratar isso, estou usando BufferedReader para a leitura.
exemplo do q to fazendo:

System.out.print(" Digite a palavra: "); try{ pPalavra.setPalavra(bfScan.readLine()); } catch(IOException e) { System.out.println("Houve Erro na entrada de dados"); }

[]'s

Como eu falei, geralmente eu prefiro o que fica mais claro, naquela classe. Se todos os atributos estão inicializados na declaração, eu permaneço na declaração.

Mas quando eu inicio uma classe, eu geralmente começo colocando tudo na declaração mesmo, até pq, é mais fácil de pensar desse jeito.

Agora, não creio que isso seja tão relevante a ponto de valer um extenso debate sobre o assunto. :wink:

Qual é a reclamação dele? Infelizmente a minha bola de cristal ficou no bolso da outra calça, heheheheh.

[quote]Qual é a reclamação dele? Infelizmente a minha bola de cristal ficou no bolso da outra calça, heheheheh. [/quote] FHDUSAH…
entaum analizando o codigo verifiquei q imaginou oq causa o erro, bom… na classe principal no menu ele espera um valor inteiro e se eu digito enter ele reclama pois recebeu um “” e naum um valor numerico acredito eu…
bom sobre isso o erro gerado é esse:

[code]
Exception in thread “main” java.lang.NumberFormatException: For input String: “”
e + algumas linhas :stuck_out_tongue:

vc pode me dizer como tratar isso, ow até msm me indicar algum link bom.

desde jah agradeço td sua ajuda…

[]'s

Faz um try catch:

try
{
   int iValor = Integer.parseInt(bfScan.readLine());   
} catch (NumberFormatException e) {
    System.out.println("Ei mané, digita um número aeee..");
}

Só uma dica de estilo, cara.

Você está usando a notação húngara, ou seja, escrevendo o tipo da variável antes do nome. O padrão do Java recomenda que não se faça isso, e com as atuais IDEs, é realmente desnecessário.

Além de gerar um código mais rebuscado, variáveis de tipos mais complexos começam a ficar com um nome realmente difícil de ser lembrado. Quem gosta dessa notação é a Microsoft, por isso, deixo aqui um exemplo de código em DirectX9:

// Set our material
gD3dDevice->SetMaterial( &m_material );

// Set the matrix to convert from model space to world space
D3DXMATRIXA16 matWorld
D3DXMatrixTranslation(&matWorld,pos.x,pos.y,pos.z);
gD3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

gD3dDevice->SetStreamSource( 0, m_vb,0, sizeof(CUBEVERTEX) );
gD3dDevice->SetFVF( D3DFVF_CUBEVERTEX );
gD3dDevice->SetIndices( m_ib);

// draw a triangle list using our 24 vertices and 12 triangles
gD3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,0,0,24,0,12);

Se não quiser acabar um dia com nomes de variáveis escabrosos como esses (D3DXMATRIXA16, D3DFVF_CUBEVERTEX, gD3dDevice) , evite esse padrão.

Fala vinni, fiz do jeito q vc disse e a classe Principal está rodando suavee, veja como ficou:

[code]
import java.io.*;

public class Principal extends Metodos{

public static void main(String[] sArgs) throws IOException{
	
	BufferedReader bfScan = new BufferedReader(new InputStreamReader(System.in));
	Integer        iOpc   = 0, iErro = 0;
	Palavras       pPalavra = new Palavras();

	while(iOpc != 5) {
		iErro = 0;
		menu(); 
		try{   
			iOpc = Integer.parseInt(bfScan.readLine());     
		} catch (NumberFormatException e) {   
		      System.out.println("\n Por favor digite um numero");   
		      iErro = 1;
		}  
		if (iOpc == 5) break;
		if (iErro != 1){
			switch(iOpc){
				case 1 : CadastrarPalavras(); break;	
				case 2 : Jogar();             break;
				case 3 : Regras();            break;
				case 4 : Desenvolvedores();   break;
				default: {
				     	System.out.println("\n Opcao Invalida");
				     	voltaMenu();
				}
			}
		}
	}
}

}[/code]

agora para tratar esse erro:
Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: 0

como devo tratar??

vinni vc tem algum link de facil entedimento para tds os casos esperados, tipo uma lista de onde usar tal catch…

[]'s

[quote=celso.martins]Tente

private List<String> arPalavra = new ArrayList<String>();

Outra coisa. Não costumo inicializar os atributos na própria declaração e sim no construtor. Não sei qual é a melhor prática.

Abraços[/quote]

Brother, eu acredito que se você inicializar uma cousa na declaração, aquela inicialização se executará sempre que um objeto daquela classe for instanciado, independentemente do constructor usado para isto!
Aquele abraço!