Pessoal estou com uma dúvida em relação ao uso de listas. Estou precisando fazer uma lista de adjacencia, para isso pensei na idéia de colocar dentro de um arraylist uma lista de modo que cada posição deste arraylist receberá uma lista ou nenhuma. Ah, lembrando que trata-se de uma lista de inteiros. Já fiz parte do código, mas não consigo acessar a lista correta na hora da inserção de elementos. Como faço isso? Abaixo está parte do código que estou usando, não sei se está correto o uso, se puderem dár uma olhada eu agradeço muito.
Classe ListaAdjacencia e seu construto
public class ListaAdjacencia implements Grafo{
ArrayList<Integer> lista;
List<List<Integer>> listaAdjacencia;
public ListaAdjacencia(int numVertice){
this.listaAdjacencia = new ArrayList<List<Integer>>();
this.listaAdjacencia = geraListas(numVertice);
}
Método privado que cria as listas e adiciona no array
private List<List<Integer>> geraListas(int dimensao){
int i = 0;
while(i < dimensao){
this.lista = new ArrayList<Integer>();
this.listaAdjacencia.add(this.lista);
i++;
}
return this.listaAdjacencia;
}
Método onde tento inserir elementos, sendo a origem a lista qual devo inserir e o destinho o valor a ser inserido
public void adicionarAresta(Vertice origem, Vertice destino){
this.listaAdjacencia.add(origem.id(), this.lista.add(destino.id()));
}
Esse último método fica marcado como se tivesse algum erro, mas não sei qual.
cara,
vc tem que fazer isso
public void adicionarAresta(Vertice origem, Vertice destino){
this.lista.add(destino.id());
this.listaAdjacencia.add(origem.id(), this.lista);
}
PS: Esse seu codigo, não vai funcionar como vc quer, presta atenção no que vc está fazendo no metodo geraListas e se lembre que qdo vc da new vc ta criando um endereço de memoria.
t+
Obrigado Alisson. E valeu pelo toque quanto ao método geraLista. O problema é que eu estou lendo de um arquivo os valores linha por linha, de modo que cada linha é como se fosse uma lista entendi? Mas como este método de adicionarAresta não pode receber uma lista (determinado por interface), eu tenho que criá-las anteriormente e, depois ir inserindo os elementos. O paramentro origem é como se fosse o numero da linha em que o programa está lendo no arquivo e o destino é cada elemento dessa linha, porém a chamada desse metodo adicionarAresta é feita a cada elemento lido, daí não dá para eu criar uma Lista dentro deste método, concorda?
independentemente do que vc tem fazer, seu codigo vai esta errado, vo te dar uma dica para vc quebrar a cabeça e aprender, no seu metodo adicionarAresta, vc SEMPRE vai adicionar o destino na ultima lista que vc criou no metodo geraListas.
t+
Entendi. Bom, então vou retirar o método geraListas da classe e fazer outro método que receba uma lista já com todos os valores inseridos por outro método e dai no método adicionarAresta, apenas insiro essa lista passada por parametro na listaAdjacencia por indexação. Se der certo eu coloco os resultados aqui.
acho que vc nao entendeu o que eu disse, vo postar o codigo
import java.util.ArrayList;
import java.util.List;
public class ListaAdjacencia {
private List<List<Integer>> listaAdjacencia;
public ListaAdjacencia(int numVertice){
this.listaAdjacencia = new ArrayList<List<Integer>>();
geraListas(numVertice);
}
private void geraListas(int dimensao){
for(int i = 0; i < dimensao; i++){
ArrayList<Integer> lista = new ArrayList<Integer>();
this.listaAdjacencia.add(lista);
}
}
public void adicionarAresta(Vertice origem, Vertice destino){
if(this.listaAdjacencia.get(origem.id()) != null){
this.listaAdjacencia.get(origem.id()).add(destino.id());
}
}
}
t+
Ah tá, eu tinha entendido outra coisa, mas não teria um jeito de eu indexar a listaAdjacencia com o valor da origem passada como parametro para que eu indique em qual das listas quero adicionar o valor, ou seja, o destino? Eu fiz a criação das listas dentro do construtor pq não consegui pensar em outra alternativa sabe. Mas me tira uma dúvida: do jeito que está do construtor eu não estou criando isso?
0 --> lista=null;
1 --> lista=null;
n --> lista=null;
???
nao, vc ta criando varias lista vazia, e a quantidade vai ser determinada pela dimensão.
e o metodo adicionarAresta, está fazendo do jeito que vc quer, ele adiciona na lista de acordo com o id da origem.
PS: não se esqueça que o primeiro index do arraylist é 0.
t+
Ok! Bom fiz as modificações propostas. Agora vamos ao teste! Olha se o método de impressão está correto?
public void imprime(){
for(int i = 0; i < this.listaAdjacencia.size(); i++){
for(int j = 0; j < this.listaAdjacencia.get(i).size(); j++){
System.out.println(this.listaAdjacencia.get(j));
}
System.out.println();
}
}
cara,
faz do jeito que eu vou te passar, fica mais elegante… 
public void imprime(){
for(List<Integer> lista : this.listaAdjacencia){
for(Integer id : lista){
System.out.println(id);
}
System.out.println();
}
}
Deu certo Alisson! Valeu mesmo! Inclusive já tinha visto este método de impressão que você me sugeriu, mas nunca tinha entendido, agora como pude ver na pratica eu entendi perfeitamente o funcionamento. E você tem razão, fica bem mais elegante. Vou fechar o tópico, será que posto o código de novo ou não é necessário? Valeu precisando de algo é só dizer… meu msn caso queira add danielrricci@hotmail.com
marca o topico com RESOLVIDO e poste o codigo para galera… 
vo te adicionar aqui…
Pessoal, ai está a parte do programa resolvida.
public class ListaAdjacencia implements Grafo{
ArrayList<Integer> lista;
List<List<Integer>> listaAdjacencia;
public ListaAdjacencia(int numVertice){
this.listaAdjacencia = new ArrayList<List<Integer>>();
listaAdjacencia = geraListas(numVertice);
}
private List<List<Integer>> geraListas(int dimensao){
int i = 0;
while(i < dimensao){
this.lista = new ArrayList<Integer>();
this.listaAdjacencia.add(this.lista);
i++;
}
return this.listaAdjacencia;
}
public void adicionarAresta(Vertice origem, Vertice destino){
this.listaAdjacencia.get(origem.id()).add(destino.id());
}
public void adicionarAresta(Vertice origem, Vertice destino, double peso){
}
public void imprime(){
int cont = 0;
for(List<Integer> lista : this.listaAdjacencia){
System.out.print(cont);
for(Integer id : lista){
System.out.print(id + "--> ");
}
cont++;
System.out.println();
}
}
}
Obrigado ai Alisson! Ah teu msn é o novo? Tipo pq se for ambos temos que adicionar senão não dá. O esquema de adição dele é diferente, não recebe convite.
Cara como coloco RESOLVIDO no nome do tópico?
Cara to on line aqui… vc tá on no msn?