[RESOLVIDO ]Dúvida com vetores

Bom dia pessoal.
Estou fazendo uns testes com vetores e matrizes com a classe ArrayList e estou com uma dúvida. Se puderem me ajudar, agradeço.
No código abaixo no método “insere_linha” não consigo entender porque não consigo mais acessar os elementos do objeto que eu criei. Agora, se eu fizer a inserção deles sem os laços de repetição, isso funciona!
Vocês devem ter notado que o código abaixo está esquisito, e está , eu sei, mas trata-se de apenas alguns testes que estou fazendo, portanto, não é para fazer sentido mesmo.

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

public class Interface
{
public List linha;

public Interface()
{
	System.out.println("Objeto instanciado.");
}

public void insere_linha()
{
	this.linha = new ArrayList<List>();
	for(int i=0; i<4; i++)
	{
		List<Integer> coluna = new ArrayList<Integer>();
		for(int j=0; j<6; j++)
		{
			coluna.add((int) (1+Math.random()*99));
		}
	}

// Isso não funciona, não consigo mais acessar os elementos do objeto coluna!
for(int i=0; i<6; i++)
{
// Coloca um zero na frente do número se ele for menor do que dez.
if( coluna.get(i) < 10 )
{
System.out.print(“0”+coluna.get(i)+" “);
}
else
{
System.out.print(coluna.get(i)+” ");
}
}
// Isso que digitei abaixo também não funciona.
System.out.println(coluna.get(0));
}

// Fim da classe.
}[/code]

A mansagem de erro é:

[quote]./Interface.java:30: error: cannot find symbol
if( coluna.get(i) < 10 )
^
symbol: variable coluna
location: class Interface
./Interface.java:32: error: cannot find symbol
System.out.print(“0”+coluna.get(i)+" “);
^
symbol: variable coluna
location: class Interface
./Interface.java:36: error: cannot find symbol
System.out.print(coluna.get(i)+” ");
^
symbol: variable coluna
location: class Interface
./Interface.java:40: error: cannot find symbol
System.out.println(coluna.get(0));
^
symbol: variable coluna
location: class Interface
4 errors
[/quote]

Obrigado.

As variáveis só existem dentro do scope em que são declaradas.

A variável coluna é declarada dentro do for, só vai existir dentro desse for. Se queres aceder depois do for, tens de a declarar antes.

Camarada, você está muito enganado.

Primeiro problema: No FOR da linha 17, a cada iteração você está criando um objeto coluna novo. Acredito que você queira criar um ArrayList e ir populando ele dentro deste FOR, certo?

Crie e instancie ele fora de qualquer FOR, e use o laço só pra popular o ArrayList.

Siga este exemplo:

private void garantaEspaco() { if(this.totalDeObjetos == this.objetos.length) { Object[] novoArray = new Object[this.objetos.length*2]; for (int i = 0; i < this.objetos.length; i++) { novoArray[i] = this.objetos[i]; } this.objetos = novoArray; } }

Note que na linha 3 o objeto é criado e instanciado, e dentro do FOR ele só é populado.

O código acima trabalha com Vetor simples, o que é mais complicado, mas a lógica que você deve seguir é a mesma!

[quote=pmlm]As variáveis só existem dentro do scope em que são declaradas.

A variável coluna é declarada dentro do for, só vai existir dentro desse for. Se queres aceder depois do for, tens de a declarar antes.[/quote]

Isso que você disse não é quando o método morre?
Acho que quando o laço termina isso que você disse não acontece. Isso que eu disse acontece em c++ mas sou novo em Java então posso estar enganado.

[quote=Ruttmann]Primeiro problema: No FOR da linha 17, a cada iteração você está criando um objeto coluna novo. Acredito que você queira criar um ArrayList e ir populando ele dentro deste FOR, certo?

Crie e instancie ele fora de qualquer FOR, e use o laço só pra popular o ArrayList.

Siga este exemplo:

private void garantaEspaco() { if(this.totalDeObjetos == this.objetos.length) { Object[] novoArray = new Object[this.objetos.length*2]; for (int i = 0; i < this.objetos.length; i++) { novoArray[i] = this.objetos[i]; } this.objetos = novoArray; } }

Note que na linha 3 o objeto é criado e instanciado, e dentro do FOR ele só é populado.

O código acima trabalha com Vetor simples, o que é mais complicado, mas a lógica que você deve seguir é a mesma![/quote]

O que eu queria fazer mas estava indo aos poucos na verdade é o seguinte. Eu queria criar um vetor de inteiros que eu chamei de “coluna”. Quando este vetor estivesse criado eu iria colocar ele em um outro vetor de vetores, um “ArrayList”, formando assim uma matriz. Só que estou com este problema de não conseguir acessar os elementos dele e me surgiu outra dúvida. Você disse que estou instanciando um novo objeto a cada “for”, isso eu vi, mas e o que acontece com o antigo objeto instanciado? Não tem nenhum método para eu liberar ele para a memória?

[quote=robgeek][quote=Ruttmann]Primeiro problema: No FOR da linha 17, a cada iteração você está criando um objeto coluna novo. Acredito que você queira criar um ArrayList e ir populando ele dentro deste FOR, certo?

Crie e instancie ele fora de qualquer FOR, e use o laço só pra popular o ArrayList.

Siga este exemplo:

private void garantaEspaco() { if(this.totalDeObjetos == this.objetos.length) { Object[] novoArray = new Object[this.objetos.length*2]; for (int i = 0; i < this.objetos.length; i++) { novoArray[i] = this.objetos[i]; } this.objetos = novoArray; } }

Note que na linha 3 o objeto é criado e instanciado, e dentro do FOR ele só é populado.

O código acima trabalha com Vetor simples, o que é mais complicado, mas a lógica que você deve seguir é a mesma![/quote]

O que eu queria fazer mas estava indo aos poucos na verdade é o seguinte. Eu queria criar um vetor de inteiros que eu chamei de “coluna”. Quando este vetor estivesse criado eu iria colocar ele em um outro vetor de vetores, um “ArrayList”, formando assim uma matriz. Só que estou com este problema de não conseguir acessar os elementos dele e me surgiu outra dúvida. Você disse que estou instanciando um novo objeto a cada “for”, isso eu vi, mas e o que acontece com o antigo objeto instanciado? Não tem nenhum método para eu liberar ele para a memória?[/quote]

Nossa, vetor dentro de vetor é complicado. Você tá só exercitando ou tem uma aplicação prática pra isso?

E quanto à pergunta do FOR, acontece o seguinte. Na primeira iteração você cria a lista e faz o que tem que fazer com ela. Na segunda iteração, tudo o que foi feito na primeira iteração vai pro lixo, aquele objeto que você criou só vai existir no escopo da iteração atual. Após terminar o que tem que ser feito e incrementar a variável de controle do FOR, vai tudo pro lixo e seu objeto se perde.

Por isso tens que criar ele fora do FOR, pra ele continuar sobrevivendo por estar em escopo de maior duração.

Qualquer dúvida vai escrevendo aqui! :wink:

Nossa! Não sabia disso, achei que o objeto só se perdia ou morria quando o método morria, como acontece em C ou C++.
Quanto a fazer vetor de vetores não é difícil cara! Pelo menos em C++ a idéia é bem aquilo que eu disse acima.
Colocarei o exemplo em C++ para você ver, mas saiba que não sou bom nessa linguagem também, mas funcionou certinho para mim. O que eu fiz foi um programa que lê um arquivo de texto que contém números em forma de tabela. Para lidar melhor com eles o programa lê os númerod, muda eles para inteiros e depois passa eles para uma matriz. Para ler o arquivo uma única vez, o jeito que encontrei foi o usado abaixo, e que queria repetir em Java mas sem usar a classe Vector. Como
só vou ler o arquivo uma única vez, não tenho como saber antes o tamanho da matriz que preciso alocar, então o único jeito é alocar um vetor de vetores e um vetor de inteiros, ambos com tamanho zero e ir aumentando ambos enquanto o arquivo não termina.
Veja:

[code]
// Isso representa a matriz por um vetor de vetores.
vector< vector > matriz;

//Isso é o vetor do exemplo da dúvida que postei em Java.
//Note que o tamanho inicial dele é 6 porque sei que o arquivo de texto que ele vai ler tem sempre seis colunas.
vector coluna(6,0);

int col =0;
char carac;

if( arquivo.is_open() )
{
    while( arquivo.good() )
    {

// Aqui tem parte do código que lê os caracteres, transforma eles em inteiro de depois coloca eles no vetor que chamei de “coluna”.
coluna[col] = x;
col++; // Anda uma posição no vetor.
if( col == 6 )
{
matriz.push_back(coluna); //Coloca o vetor criado no vetor de vetores, faz isso dinâmicamente já que não sei o tamanho do arquivo.
col = 0;
}
}
}
else
{
cout<<“Arquivo nao encontrado.”<<endl;
}[/code]

Agora que postei isso, vi meus erros. Vou definir fora de todos os laços um vetor de tamanho 6 como fiz em C++ e depois só vou preenchendo e repreenchendo e colocando eles no vetor de vetores. Acho que vai funcionar.

Entendi colega. :smiley:

Mas você pode notar que no seu exemplo em C++ você declarou os dois vetores fora de qualquer laço de repetição, e do mesmo modo deve fazer em Java.

Se conseguiu sanar todas as suas dúvidas, coloque um [RESOLVIDO] no nome do tópico. Ajuda quem pesquisa soluções no fórum!

:wink: