iterator en Java
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

iterator en Java



  1. #1
    invite806372c6

    iterator en Java


    ------

    bjr
    je suis debutante en java , je vien de lire la notion d iterator et les ListeIterator mais je comprend pas de quoi sagit-il; merci me m avoir clarifier la notion ou de m indiquer un doccument qui peux me clarifier ceuci;;

    -----

  2. #2
    invite8214f726

    Re : iterator en Java

    Bonjour

    Pour faire simple et rapide les Iterator sont des objets qui te permettront de parcourir une structure de données.

    Commençons par un exemple rapide exploitant une liste puisque c'est ce que tu évoques (on rentrera dans le comment du pourquoi juste après) :

    Code:
    List<Object> listObjets = new ArrayList<Object>();
    
    [...]
    
    Iterator it = listObjects.iterator();
    
    while(it.hasNext())
    {
    Object tmpObject = (Object) it.next();
    System.out.println(tmpObject);
    }
    Dans un premier temps je déclare une liste d'objets (ArrayList dans e cas précis).
    Dans le passage [...], tu imagines le traitement que tu veux l'idée étant que tu remplisses ta liste, c'est mieux pour la parcourir.

    La partie intéressante arrive.

    Je déclare un Iterator que j'instancie comme étant l'itérator de ma liste.
    Puis pour le pacours de ma liste :
    Je vérifie qu'il y a bien un objet suivant, si il en a un je crée un objet temporaire qui prend sa valeur, et ensuite je l'affiche sur ta sortie standart.

    Ce qu'il est important de comprendre ici :
    J'ai déclaré en fait un tableau, en effet tu n'es pas sans savoir qu'une ArrayList est un tableau (j'aurais pu choisir une list chainée en prenant LinkedList par exemple).
    Tu sais également qu'un tableau peut aussi être modélisé sous forme de pointeur et que pour le parcours d'un tableau en fait on se contente de déplacer notre pointeur d'un élément au suivant tant qu'il y a des éléments.

    C'est exactement ce qu'on fait ici :
    Code:
    Iterator it = listObjects.iterator();
    Cette étape initialise notre pointeur au début du tableau.

    Code:
    it.hasNext()
    Permet de vérifier qu'il y a un élément suivant (cette opération renvoie un booléen tout simplement).

    Code:
    it.next()
    Cette opération fait avancer notre pointeur ET renvoie la valeur de l'élément courant.

    Voilà pourquoi nous parcourons le tableau ici, et pourquoi nous récupérons bien les valeurs, alors que 2 commandes suffisent.

    Mais maintenant viennent 2 questions qui sont liées :
    Pourquoi utiliser un Iterator si je peux tout simplement parcourir mon tableau ? Qu'est ce qu'un ListIterator ?

    L'intérêt d'utiliser un Iterator c'est que comme je te l'ai dit en premier : il te permet de parcourir les structures de données. C'est à dire qu'il est instanciées pour un bon nombre d'entre elles.

    Par exemple je t'ai dit que j'aurais pu utiliser une liste chainée, au lieu d'utiliser un tableau, pour ma liste.
    Dans le code d'exemple la seule chose à changer c'est la première ligne :
    [code]List<Object> listObjects = new LinkedList<Objects>();[/list]
    Je ne touche à RIEN d'autre, et le même code (avec tout iterator) est bon.

    Iterator te permet donc de parcourir toutes tes structures de données de la même façon. Alors les intérets sont multiples.

    Soit tu as mal préparé ton code et tu te retrouves à devoir changer de structure de données en cors de route. Dans ce cas une ligne à changer c'est pas un drame (mais à éviter), si tu avais codé à la main ton parcours de tableau tu étais bonne pour tout recoder.

    Soit tu exploites une fonction qui peut être amenée à utiliser plusieurs types de structures. Par exemple tu as une fonction qui formatte de façon particulière ton affichage de données (disons que ça les renvoie dans un tableau en HTML). Tu souhaites l'utiliser pour une ArayList et une LinkedList parce que tu n'as pas envie de développer 2 fois cette fonction, et parce que tu as bien besoin de ces 2 structures différentes à un autre endroit de ton code.

    Tu pourras faire quelque chose de ce genre :
    Code:
    private void init() {
    List<Object> tableauObjets = new ArrayList<Object>();
    List<Object> listeChaineeObjets = new LinkedList<Object>();
    
    [...]
    
    this.afficheListe(tableauObjets);
    this.afficheListe(listeChaineeObjets);
    }
    
    private void affciheListe(List myList)
    {
    System.out.println("<table>");
    
    Iterator it = myList.iterator();
    
    while(it.hasNext())
    {
    Object tmpObject = (Object) it.next();
    System.out.println("<tr><td>"+tmpObject+"</td></tr>");
    }
    }
    Tu vois avec la même fonction je peux très bien afficher une ArrayList et une LinkedList. Je viens dans ce cas de rendre mon affichage indépendant de l'implémentation de ma liste.

    En fait ce genre de raisonnement (généralisation) c'est l'esprit même du développement Objet, et l'un des avantages de Java c'est justement d'être particulièrement adapté à ces manipulations.

    Pour finir sur les avantages il y a fort à parier que les développeurs de Java soient plus expérimentés que toi, et exploiter leur spécification d'un Iterator plutôt que de coder tes parcours de liste à la main devraient te permettre d'optimiser ton code.

    Et donc sur le sujet du ListIterator ? En fait ListIterator comme tu dois t'en douter est l'Iterator spécifique pour une Liste, si tu utilise une HashMap par exemple ce ne sera pas le même Iterator qui sera utilisé.

    Donc quand tu fais :
    Code:
    Iterator it = myListe.iterator()
    C'est un liste iterator qui est instancié, si tu utilisais une HashMap un autre type d'Iterator aurait été instancié.

    Nous sommes toujours dans le même cas de généralisation que mon mini exemple avec une LinkedList et une ArrayList.

    la bonne pratique est bien sur d'utiliser un Iterator et non un ListIterator, puisque tu t'affranchis ainsi du type de structure.

    Si t as bien tout compris tu dois pouvoir répondre à 2 questoins pertinentes dans ces exemples :
    • Pourquoi est ce qu'on instancie une List alors qu'on exploite une ArrayList dans notre exemple ?
    • Pourquoi ai je un Warning quand je fais Iterator it = myList.iterator() et pourquoi je dois caster mon iterator quand je récupère mon objet ? Comment remédier à ça, est ce que je dois le faire, dans quel cas ?

    Pour finir voici de la documentaion qui te pemettra de comprendre ces concepts si tu as des qeustions sur ce que j'ai dit :
    Rappels sur l'héritage
    Interfaces en Java
    Méthode Aspect
    Structures de données en Java (tableaux et collections

    Si tu veux des précisions réponds dans ce message tout simplement, mais pense bien à essayer de tout comprendre avant.

    PS : quelques erreurs de code se sont peut être glissées, je suis pressé et je n'ai pas eu le temps de tester.

  3. #3
    invite806372c6

    Re : iterator en Java

    Mercii infiniment
    Dernière modification par JPL ; 28/04/2011 à 16h59. Motif: Suppression d'une longue citation parfaitement inutile

Discussions similaires

  1. Java
    Par inviteaa1623c4 dans le forum Logiciel - Software - Open Source
    Réponses: 11
    Dernier message: 02/04/2009, 18h38
  2. java
    Par inviteace9a711 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 08/02/2009, 23h33
  3. java
    Par inviteafd8fc22 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 18/05/2008, 08h07
  4. Java, java, java, where are you, there's a mission for you !
    Par invite1237a629 dans le forum Logiciel - Software - Open Source
    Réponses: 35
    Dernier message: 16/03/2008, 23h10