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 :
publicclassVertex{privateStringid;// id do vérticeprivateintindex;privateLinkedList<WeightedEdge>edges;// contêm a lista de arcos q têm origem neste vérticepublicVertex(Stringid,intindex){this.id=id;// identificador do vérticethis.index=index;// indice onde o vértice se encontra no grafo}}
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
saunde
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
T
thingol
Primeira coisa. Vamos declarar a tal classe:
classVertexIteratorimplementsIterator<Vertex>{/** * Returns true if the iteration has more elements. */publicbooleanhasNext(){}/** * Returns the next element in the iteration. */publicVertexnext(){}/** * Removes from the underlying collection the last element returned by the iterator (optional operation) */publicvoidremove(){}}
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
saunde
e agora como é k faço o método ?
publicVertexIteratorgetEdgesIterator(){
//todo
}
Alguém me pode ajudar ?
T
thingol
Crie uma instância de VertexIterator (passando “edges” para seu construtor?) e a retorne.
Type mismatch: cannot convert from ListIterator to Vertex.VertexIterator
T
thingol
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
saunde
bah… este trabalho é uma confusão… :-S
Já nem sei por onde pegar :-S
public class VertexIterator implements Iterator{
publicVertexIterator(WeightedEdgewe){// é assim ?? }.............
S
saunde
Vou pôr aqui as duas classes, talvez seja mais fácil.
packageSegundoTrabalhoTerceiraParte;importjava.util.*;publicclassVertex{privateStringid;// id do vérticeprivateintindex;privateLinkedList<WeightedEdge>edges;// contêm a lista de arcos q têm origem neste vérticepublicVertex(Stringid,intindex){this.id=id;// identificador do vérticethis.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 */publicbooleanaddEdge(Vertexd,intp){WeightedEdgewe=newWeightedEdge(this,d,p);return(edges.add(we));}/* retorna true se o objecto referência um vértice, caso contrário é falso*/publicbooleanequals(Objecto){if(oinstanceofVertex){Vertexv=(Vertex)o;if(this.id==v.id)returntrue;}returnfalse;}/* public VertexIterator getEdgesIterator(){ VertexIterator vit = edges.listIterator(); return vit ; } */publicStringgetId(){returnid;}publicintgetIndex(){returnindex;}publicbooleanremoveEdge(WeightedEdgea){Iteratorit=edges.listIterator();while(it.hasNext()){if(a.equals(it.next())){it.remove();returntrue;}}returnfalse;}publicStringtoString(){returngetId();}publicclassVertexIteratorimplementsIterator<Vertex>{publicVertexIterator(WeightedEdgewe){// é assim ?? }publicbooleanhasNext(){if(edges.listIterator().hasNext())returntrue;returnfalse;}publicVertexnext(){if(hasNext()){returnedges.listIterator().next().getEnd();}returnnull;}publicvoidremove(){edges.getLast().getEnd().edges.remove();}}}
packageSegundoTrabalhoTerceiraParte;publicclassWeightedEdge{privateintweight;//peso do arcoprivateVertexinit,end;//vértice de inicio e fim do arco//cria um arco com inicio em vo, fim em vd e peso p publicWeightedEdge(Vertexvo,Vertexvd,intp){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érticespublicbooleanequals(Objecto){if(oinstanceofWeightedEdge){WeightedEdgewe=(WeightedEdge)o;if((this.init==we.init)&&(this.end==we.end))returntrue;}returnfalse;}//retorna o vértice de destino do arcopublicVertexgetEnd(){return(this.end);}//retorna o vértice de origem do arcopublicVertexgetInit(){return(this.init);}//retorna o peso do arcopublicintgetWeight(){returnweight;}//exibe o arco e os seus parâmetrospublicStringtoString(){return"("+this.init+","+this.end+","+this.weight+")";}}