TP2 publish - question1 - iterator()

Conception de logiciels Intranet : patrons et canevas

Modérateurs : Douin, graffion

NAVARRO
Messages : 35
Inscription : 02 oct. 2016 13:44

TP2 publish - question1 - iterator()

Message par NAVARRO » 27 févr. 2018 14:55

Bonjour,

Concernant la méthode iterator() , je suis aussi un peu bloqué.

J'ai du mal à comprendre le problème du remove , mais je pense que cela vient du fait que je comprends peut être mal le concept d'un iterator.
Ce que j'ai du mal à comprendre est que le remove à lieu dans la classe du test mais nous devons le gérer dans la méthode iterator de la classe Mediator...

Pour l'implémentation de la classe Mediator, j'ai créé un arrayList a partir d'une List<Topic>. et je récupère l'itérateur par la méthode iterator​()
https://docs.oracle.com/javase/9/docs/a ... /List.html

Iterator<E> iterator​() Returns an iterator over the elements in this list in proper sequence.

La méthode iterator() du TP:

/** Parcours du médiateur, sans retrait possible.
* L'appel de remove lève une exception de type RuntimeException
* @return un itérateur par les thèmes présents
*/

public Iterator<Topic> iterator();


La classe de test:


public void testIterator() throws Exception{
mediator.add(s1).add(s6); // deux thèmes sont présents
Iterator<Topic> it = mediator.iterator();
Topic t1 = it.next();
assertTrue(" topic ?", t1.equals(planif) || t1.equals(meteo));
Topic t2 = it.next();
assertTrue(" topic ?", t2.equals(planif) || t2.equals(meteo));
try{
it = mediator.iterator();
it.next();
it.remove();
fail(" une exception est attendue !!");
}catch(Exception e){
assertTrue( e instanceof RuntimeException);
}
int count = 0;
for(Topic t : mediator){
count = count + mediator.getSubscribers(t).size();
}
assertEquals(" nombre d'abonnés ?", 2, count);
}

Merci de votre aide!

Cordialement.
Vincent.

slash
Messages : 52
Inscription : 04 nov. 2017 2:45

Re: TP2 publish - question1 - iterator()

Message par slash » 27 févr. 2018 15:46

Bonjour,

Tu es sur la bonne piste. Il te suffit de redéfinir la méthode remove() de l'Iterator retourné par ton ArrayList, et de renvoyer une instance de cet Iterator.
J'ai trouvé ça qui pourrait t'aider : https://stackoverflow.com/questions/584 ... or-in-java

FlorentR
Messages : 17
Inscription : 12 nov. 2017 17:19

Re: TP2 publish - question1 - iterator()

Message par FlorentR » 27 févr. 2018 15:48

L'itérator porte sur une Collection<T>. On peut très bien lui passer une collection non modifiable. Il existe une fonction pour se faire!

FlorentR
Messages : 17
Inscription : 12 nov. 2017 17:19

Re: TP2 publish - question1 - iterator()

Message par FlorentR » 27 févr. 2018 16:12

Je pense ceci dit que l'approche proposée par Slash est à préférer.
En Q2 j'ai un fonctionnement tout à fait conforme aux attentes. Mais en en Q1 tous les tests ne sont pas au vert sans pour autant avoir d'erreurs...

STB
Messages : 23
Inscription : 22 févr. 2017 19:44

Re: TP2 publish - question1 - iterator()

Message par STB » 27 févr. 2018 16:19

Bonjour,

je pense qu'une bonne option est de redéfinir la classe Iterator<Topic> en utilisant la méthode iterator() de la liste de subscribers.
Pour remove(), retourner par exemple une RuntimeException.

Stéphane

MARIE_JOSEPH
Messages : 3
Inscription : 05 déc. 2017 20:54

Re: TP2 publish - question1 - iterator()

Message par MARIE_JOSEPH » 27 févr. 2018 20:07

Moi j'ai carrément utilisé 1 nouvelle classe implémentant Iterable
pour redéfinir les méthodes, sans les ré-implémenter.

private class MediatorIterator implements Iterator {
Iterator it;
public MediatorIterator(Set<Topic> t){ it = t.iterator(); }
public boolean hasNext(){ return it.hasNext();}
public Object next(){ return it.next(); }
public void remove(){ throw new RuntimeException(); }
// public Iterator iterator(){ return this ; }
}

je lui passe 1 HashSet des différents topics en paramètres
et je récupère 1 itérateur
return new MediatorIterator(topics);

Rv

NAVARRO
Messages : 35
Inscription : 02 oct. 2016 13:44

Re: TP2 publish - question1 - iterator()

Message par NAVARRO » 27 févr. 2018 21:17

Merci beaucoup à tous ! :)

Ce forum est vraiment super.
J'avais déjà remarqué en NFP121 une entraide formidable.

J'espère que je vous pourrais vous aider en retour! mais pour l'instant je suis un peu en retard ;)

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité