[Resolvido] Array List dentro de ArrayList

9 respostas
TheJayyBe

Olá, estou criando um programa que recebe dados de um txt, e o transporta para um array de Strings em tempo real, ou seja, de período em período o arquivo é modificado. O texto do arquivo recebe ou perde linhas, por isso escolhi o ArrayList, por necessitar de um Array dinâmico. (Array.add(String x) )

Estou recebendo o seguinte erro:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.set(Unknown Source)
at pacote.Viewer.main(Viewer.java:80)

Meu código não faz o que pretende. Eis as partes que interessam do mesmo:

Conta variáveis por linha: (Linhas terminadas por '$', variáveis separadas por '#')
for(int i = 0;primChar[i]!='$';i++)
			{
				if (primChar[i]== '#')contadorVariaveis++;            
			}...
...
ArrayList<ArrayList> listas = new ArrayList<ArrayList>(); 
     for (int n=0;n<contadorVariaveis;n++)
     {
	listas.add(n,new ArrayList<String>());            
     }
String parcial = "Algum Texto";
                           listas.get(coluna).set(numLinha, parcial);

O que estou fazendo errado em relação a implantação desse texto no arrayList dentro do arrayList, esse último código fiz procurando em toneladas de fóruns.

9 Respostas

E

Amigo seu erro no codigo abaixo:

String parcial = "Algum Texto";  
    listas.get(coluna).set(numLinha, parcial);

você esta dando um get numa lista que esta vazia

E

Você sabe usar Map? O seu problema parece ser mais facilmente resolvível por um Map<String, List> que um ArrayList<ArrayList>.
O problema que você deve estar encontrando é que arrays e ArrayLists começam na posição 0 e, conforme lhe disseram, você está tentando acessar uma lista vazia. Ou seja, você provavelmente está com um problema no seu contador de variáveis.

TheJayyBe

erato690:

Amigo seu erro no codigo abaixo:

String parcial = "Algum Texto";  
    listas.get(coluna).set(numLinha, parcial);

você esta dando um get numa lista que esta vazia

Contador de variáveis está ok! Ele está contando as 6 variáveis e implantando tudo.

É correta esta sintaxe?

listas.get(coluna).set(numLinha, parcial);

O que quero é dar um add em um arraylist dentro de um arraylist.

Ex:
coluna 1,linha 1
coluna 2,linha 1
coluna 1,linha 2
coluna 2,linha 2

TheJayyBe

O que quero fazer:

O arquivo será modificado por um aplicativo externo (o programa recriar a lista de segundo a segundo).

Porque usei ArrayList?

Porque são vetores dinâmicos, não possuo a contagem de linhas do arquivo portanto posso usar add até ele achar uma linha sem informação.

Porque usei ArrayLists dentro de outra lista?

Porque não existe modo de atribuir nome de variáveis de modo automático, portanto uso o número da posição do ArrayList dentro do ArrayList. Explicando melhor:

Não posso fazê-lo criar n listas de acordo com os número de váriaveis (’#'s +1):
1#X0#Y0#Z0#SX1#SY1$

contagemVariaveis =1; //Pois  começo com uma variável.

for (i=0;char[i]==$;i++){

if (char[i]==’#) contagemVariaveis++;

}

/*

for (i=0;i<contagemVariaveis;i++){

ArrayList i = new ArraylLst(); <<- (Não existe)

}

*/

No entanto posso fazer:

ArrayList<ArrayList> listas = new ArrayList<ArrayList>();

for ([color=red]i[/color]=0;[color=red]i[/color]<contagemVariaveis;[color=red]i++[/color]){

listas.add([color=red]i[/color],new ArrayList());

}
M

Uma pergunta: os atributos de cada linhas são sempre os mesmos 5 (PosX, PosY, PosZ, scaleX e scaleY)?

Se sim, ao invés de usar um ArrayList de ArrayList, crie uma classe com as propriedades que você precisa e use um ArrayList dessa classe.

Assim, no código de leitura do arquivo você faria um laço em todas as linhas e, para cada linha, quebraria o texto em todos os caracteres ‘#’ (use o método split da classe String para isso). Depois, basta definir os atributos da classe a partir desses valores.

Outra pergunta: os números são sempre sequenciais no arquivo (começam do 1 e vão até o total de linhas)? Se sim, não me parece fazer sentido ter essa informação no arquivo, concorda? Para saber qual número é, basta verificar em qual linha está (ou, no caso do seu programa, em qual posição do ArrayList está) o elemento.

TheJayyBe

marcobiscaro2112:
Uma pergunta: os atributos de cada linhas são sempre os mesmos 5 (PosX, PosY, PosZ, scaleX e scaleY)?

Se sim, ao invés de usar um ArrayList de ArrayList, crie uma classe com as propriedades que você precisa e use um ArrayList dessa classe.

Assim, no código de leitura do arquivo você faria um laço em todas as linhas e, para cada linha, quebraria o texto em todos os caracteres ‘#’ (use o método split da classe String para isso). Depois, basta definir os atributos da classe a partir desses valores.

Outra pergunta: os números são sempre sequenciais no arquivo (começam do 1 e vão até o total de linhas)? Se sim, não me parece fazer sentido ter essa informação no arquivo, concorda? Para saber qual número é, basta verificar em qual linha está (ou, no caso do seu programa, em qual posição do ArrayList está) o elemento.

O número na primeira linha é essencial para mim porque tenho que saber se o programa que está editando esse arquivo está fazendo o papel dele corretamente ou está com problemas em implantar alguma linha. Sobre o split eu sei fazer, não sei se é do modo que você está pensando, veja:

linha=line.readLine(); char[] caracteres = linha.toCharArray();

// (Apenas partes do código) if (caracteres[i]!= '#' && incrementarTxt==true) { if(parcial==null) { parcial=""; } parcial=parcial+caracteres[i]; } //

Meu problema é realmente a sintaxe de implementar dentro do array:
O mais próximo que cheguei foi isso, e acho que aí está o erro não?
listas.get(coluna).set(numLinha, parcial);

Tenho que fazer desta forma: Implante dentro do ArrayList listas no ArrayList que se encontra nele de número 1 ou 2 ou 3 (o número que eu disser) , na posição x o String parcial.

Sobre isso de fazer uma classe com os atributos e instanciá-la, poderia dar um exemplo de como ficaria a implantação? Não compreendi muito bem e se não restar alternativa, o farei.

TheJayyBe

Para ficar mais claro, só preciso da correta sintaxe para setar um valor de arraylist dentro de outro:

M

Quando falei sobre split, me referi a um método que já existe na classe String.

Crie um ArrayList de ArrayList. Depois, para cada linha do arquivo, crie um ArrayList de String (que representa cada linha lida) e coloque os elementos da linha nesse ArrayList. Por fim, adicione o ArrayList linha no ArrayList listas. Seria algo como:

ArrayList<ArrayList<String>> listas; // instancie o ArrayList aqui

while (scanner.hasNextLine()) {
    ArrayList<String> linha; // instancie

    String texto = scanner.nextLine();

    String[] partes = texto.split("#");

    // faça um laço no vetor partes e adicione cada elemento no ArrayList linha

    // adicione a linha no ArrayList listas
    listas.add(linha);
}
TheJayyBe

Resolvido galera, obrigado a quem tentou ajudar mas achei a solução perfeita ao meu problema.

A solução:

Criado 12 de outubro de 2011
Ultima resposta 31 de out. de 2011
Respostas 9
Participantes 4