Retornar iterador

7 respostas
T

aloha…

eu tenho um iterador que vou precisar numa outra classe, para isso faço um método que retorna esse mesmo iterador… então eu fiz assim…

// Percorre a lista de arcos e retorna um iterador para os vértices
	public VertexIterator getEdgesIterator() {
		VertexIterator vI = new VertexIterator();
		return vI;
	}



	public class VertexIterator implements Iterator {
		Iterator it = edges.listIterator();

		// testa se há seguinte
		public boolean hasNext() {
			return (it.hasNext());
		}

		// retorna o próximo elemento
		public WeightedEdge next() {
			return (WeightedEdge)it.next();
		}

		// remove um arco
		public void remove() {
			it.remove();
		}

	}

só que n funciona… o k estarei fazendo errado ?

7 Respostas

T

“Não funciona” quer dizer que “não compila”, é isso?

T

aloha…

compilar compila… mas por exemplo… ao fazer este código :

while (init.getEdgesIterator().hasNext()) {
				System.out.println(init.getEdgesIterator().next());
			}

ele devia de mostrar todos os valores que fazer parte da lista… certo ?
e n é o k está acontecendo… ele apenas mostra 1 valor …e fica em loop infinito…

T

O seu problema é que está sempre criando uma nova instância de VertexIterator() a cada vez que se chama getEdgesIterator(). Isso faz com que ele sempre volte um novo listIterator() (veja a linha “edges.listIterator()”) que está inicializado com a primeira posição.

Uma forma boba de corrigir isso é fazer o seguinte:

VertexIterator vit = init.getEdgesIterator();
	while (vit.hasNext()) {
 				System.out.println(vit.next());
 			}

Aí você chama getEdgesIterator apenas uma vez.

T

mas eu tenho a Class Vertex Iterator noutra class como Inner class… n consigo criar nada do tipo vertex iterator nesta classe onde preciso deste código…

Não há outra maneira de resolver o problema ?

T

Você poderia então tentar fazer algo como:

private VertexIterator vI;
 	public VertexIterator getEdgesIterator() {
                if (vI == null)  vI = new VertexIterator();
 		return vI;
 	}

Só que aí você não consegue “reiniciar” o iterador. Não sei o que é pior.

1112

Como VertexIterator implementa Iterator, pode-se fazer assim:

Iterator vit = init.getEdgesIterator(); while (vit.hasNext()) { System.out.println(vit.next()); }

T

muito obrigado…

Criado 18 de maio de 2006
Ultima resposta 18 de mai. de 2006
Respostas 7
Participantes 3