Iterator

15 respostas
S

Boas, tenho um problema grave com iteradores, não consigo fazer este método !

public VertexIterator getEdgesIterator(){ 
//falta fazer 

}

em que edges é:

private LinkedList <WeightedEdge> edges;

e vertex é uma classe :

public class Vertex {

	private String id; // id do vértice
	private int index;
	private LinkedList <WeightedEdge> edges; // contêm a lista de arcos q têm origem neste vértice

	public Vertex(String id,int index){

		this.id=id; // identificador do vértice
		this.index=index; // indice onde o vértice se encontra no grafo
	}

  }

alguém me pode ajudar ?

15 Respostas

T

O que é um VertexIterator? É um Iterator<Vertex> ?

S

sim, é isso…

marcioa1

Tente for each.

for (WeightedEdge aEdge:edges){
    System.out.println(aEdge);
}

Márcio

S

não percebi

marcioa1

O código que coloquei varre a lista, do primeiro ao último elemento. Não era isto que queria fazrer com o Iterator ?

Márcio

S

Mas depois como é k faço o retorno do tipo VertexIterator ? é que tenho que seguir um UML, eu estou tentando implementar a Classe VertexIterator que implementa Iterator, mas estou com uns problemas em fazer os métodos :frowning:

T

Primeira coisa. Vamos declarar a tal classe:

class VertexIterator implements Iterator<Vertex> {
    /** 
     * Returns true if the iteration has more elements.
     */
    public boolean 	hasNext() {
    }
    /** 
     * Returns the next element in the iteration.
     */
    public Vertex 	next() {
    }
    /** 
      * Removes from the underlying collection the last element returned by the iterator (optional operation)
      */  
    public void 	remove() {
    }
}
S
public class VertexIterator implements Iterator<Vertex>{
		
		

		public boolean hasNext() {
			if(edges.listIterator().hasNext())return true;
			return false;
		}

		public Object next() {
			if(hasNext()){
				return edges.listIterator().next().getEnd();
			}
			
			return null;
		}

		public void remove() {
			edges.getLast().getEnd().edges.remove();

		}


	}

Isso tá errado né ?

T

Por que estaria errado? Teste e diga se está errado.
(Dica: a única coisa obviamente errada é você ter implementado “E next()” que é o que aparece no Javadoc como “public Object next()”.
Se você está usando Generics, use “public Vertex next()” mesmo, já que E == Vertex.
A implementação em si não sei se está errada, porque não conheço o seu problema.

S

e agora como é k faço o método ?

public VertexIterator getEdgesIterator(){

// to do 
		
}

Alguém me pode ajudar ?

T

Crie uma instância de VertexIterator (passando “edges” para seu construtor?) e a retorne.

S
public VertexIterator getEdgesIterator(){
		VertexIterator vit = edges.listIterator();
		return vit ; 
		}

Eu tentei assim mas dá um erro :

Type mismatch: cannot convert from ListIterator to Vertex.VertexIterator

T

Hum, para que serve aquela classe VertexIterator que a gente estava começando a escrever? Ponha um construtor nela que receba edges, e então o tal método getEdgesIterator deve retornar uma instância de VertexIterator.

S

bah… este trabalho é uma confusão… :-S

Já nem sei por onde pegar :-S

public class VertexIterator implements Iterator{

public VertexIterator(WeightedEdge we){
		// é assim ?? 
	}
     .............
S

Vou pôr aqui as duas classes, talvez seja mais fácil.

package SegundoTrabalhoTerceiraParte;

import java.util.*;

public class Vertex {

	private String id; // id do vértice
	private int index;

	private LinkedList <WeightedEdge> edges; // contêm a lista de arcos q têm origem neste vértice

	public Vertex(String id,int index){

		this.id=id; // identificador do vértice
		this.index=index; // indice onde o vértice se encontra no grafo
	}

	/*Adiciona um novo arco a edges, com origem neste 
	 * vértice, fim e peso passados como parâmetros */

	public boolean addEdge( Vertex d,int p){
		WeightedEdge we = new WeightedEdge(this,d,p);
		return(edges.add(we));
	}

	/* retorna true se o objecto referência um vértice, caso contrário é falso*/
	public boolean equals(Object o) {
		if (o instanceof Vertex) { 
			Vertex v = (Vertex) o;
			if (this.id == v.id)
				return true;
		}
		return false;
	}

/*	public VertexIterator getEdgesIterator(){
		VertexIterator vit = edges.listIterator();
		return vit ; 
		}
		*/
		
	

	public String getId(){
		return id;
	}

	public int getIndex(){
		return index;
	}

	public boolean removeEdge(WeightedEdge a){
		Iterator it = edges.listIterator();
		while(it.hasNext()){
			if(a.equals(it.next())){
				it.remove();
				return true;
			}
		}
		return false;
	}


	public String toString(){
		return getId();
	}


	public class VertexIterator implements Iterator<Vertex>{
		
		public VertexIterator(WeightedEdge we){
			// é assim ?? 
		}

		public boolean hasNext() {
			if(edges.listIterator().hasNext())return true;
			return false;
		}

		public Vertex next() {
			if(hasNext()){
				return edges.listIterator().next().getEnd();
			}
			
			return null;
		}

		public void remove() {
			edges.getLast().getEnd().edges.remove();

		}


	}
}
package SegundoTrabalhoTerceiraParte;

public class WeightedEdge {

	private int weight; //peso do arco
	private Vertex init, end;  //vértice de inicio e fim do arco


	//cria um arco com inicio em vo, fim em vd e peso p 
	public WeightedEdge(Vertex vo, Vertex vd, int p){
		this.init = vo;
		this.end = vd;
		this.weight = p;
	}

	// retorna true se o objecto ref arco igual,false caso contrário
	//2 arcos são iguais se ligarem os mesmos vértices
	public boolean equals(Object o) {
		if (o instanceof WeightedEdge) { 
			WeightedEdge we = (WeightedEdge) o;
			if ((this.init == we.init) && (this.end == we.end))
				return true;
		}
		return false;
	}

	//retorna o vértice de destino do arco
	public Vertex getEnd(){
		return (this.end);
	}

	//retorna o vértice de origem do arco
	public Vertex getInit(){
		return (this.init);
	}

	//retorna o peso do arco
	public int getWeight(){
		return weight;
	}

	//exibe o arco e os seus parâmetros
	public String toString(){
		return "("+this.init+","+ this.end + ","+ this.weight +")";
	}
}
Criado 5 de maio de 2006
Ultima resposta 5 de mai. de 2006
Respostas 15
Participantes 3