IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Parcours arrayList + remove object


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Par défaut Parcours arrayList + remove object
    Boujour,
    Je voudrais parcourir une arrayList que j'ai crée pour supprimer un élément de celle-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public class Banque {
    	private ArrayList<CompteBancaire> banque;
    	protected int choix1 = 0;
    	protected int compteAchercher = 0;
     
     
    	public Banque(){
    		banque = new ArrayList<CompteBancaire>();
    	}
     
            //......du code qui fait un menu
     
           switch(choix1){
    				case 1:
                                            //..j'entre dans mon menu est je demande à l'utilisateur de rentrere un numéro de comte
    					Scanner chaine16 = new Scanner(System.in);
    					System.out.print("Entrez un numero de compte");
    					String s3 = chaine16.nextLine();
    					compteAchercher = Integer.parseInt(s3);
     
    					if(banque.isEmpty()== false){  //..Si ma liste n'est pas vide je commance l'iteration de la Liste.
    						for(Iterator<CompteBancaire> iterator = banque.iterator();iterator.hasNext();){
    							if(compteAchercher == CompteBancaire.numeroDeCompte){ //..Si le compteAchercher == au numeroDeCompte de l'objet CompteBancaire je fait mon traitement.
    								System.out.println("compte trouvé...");
    								int index = banque.indexOf(iterator); //..Je recupère l'index de mon iterator
    								System.out.println(index);
    								banque.remove(index); // ..je supprime mon objet compte bancaire
    								System.out.println("compte supprimé");
    							}
    							else{
    								System.out.println("compte non trouvé");
    							}
    						}
    					}
    					else{
    						System.out.println("Aucun compte n'est présent dans la liste");
    					}
    					break;
    je ne comprends pas comment faire car comme retour le programme m'affiche:
    compte trouvé
    -1
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.remove(Unknown Source)
    at frunivcezanne.sircoulomb.banque.Banque.menu(Banque.java:141)
    at frunivcezanne.sircoulomb.banque.Banque.menu(Banque.java:67)
    at frunivcezanne.sircoulomb.banque.Banque.menu(Banque.java:43)
    at frunivcezanne.sircoulomb.banque.Banque.menu(Banque.java:43)
    at main.Test.main(Test.java:11)
    Quelqu'un peut il m'aider?
    Merci à tous

  2. #2
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Bonjour,

    L'erreur ce situe ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int index = banque.indexOf(iterator);
    Tu passe l'instance d'iterator en paramètre de indexOf, l'instance d'iterator n'est pas dans ta liste (normal c'est une liste d'instance de CompteBancaire) tu as donc -1 en tant que valeur d'index d'où l'exception qui est lancée.

    Il faut faire le code suivant pour récupérer l'objet depuis un iterator:
    La correction pour ton code (tu n'es pas obligé de passer par les index, tu peux directement appeler remove en passant l'objet en paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /*int index = banque.indexOf(iterator); //..Je recupère l'index de mon iterator
    System.out.println(index);
    banque.remove(index); // ..je supprime mon objet compte bancaire*/
    banque.remove(iterator.next());

  3. #3
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Encore une chose,

    Ton code peut-être largement optimisé. Il n'est pas utile de faire une itération sur l'ensemble de ta liste de CompteBancaire pour trouver l'instance correspondant au numéro de compte. Imagine la perte de temps sur une grosse liste !

    Je te conseille d'utiliser l'interface Map au lieu de List en te servant du numéro de compte bancaire en temps que clé. Ca te permettra de récupérer directement le bon compte comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    banque.get(numeroDeCompte);

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Par défaut thx
    Ok je vais essayer avec Map car en effet si j'ai une grosse liste de compte cela risque d'être problématique.
    Merci pour le coup de pouce!!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Par défaut soucis
    aye décidément!! j'ai encore un soucis.
    j'ajoute correctement mes comptes, cepednant je ne peux supprimer que le dernier compte entrée. Si j'essaye de supprimer un autre compte que le dernier, je rentre dans mon else{compte non trouvé} et je boucle indéfiniment!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    package frunivcezanne.sircoulomb.banque;
     
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.Scanner;
     
    import frunivcezanne.sircoulomb.personne.Personne;
     
    public class Banque {
    	private ArrayList<CompteBancaire> banque;
    	private float solde = 0;
    	protected int choix = 0;//..variable pour le switch
    	protected int compteAchercher = 0;
     
     
    	public Banque(){
    		banque = new ArrayList<CompteBancaire>();
    	}
     
    	public void menu(){
     
    //..ajout d'un compte       
    case 1:
    					System.out.println("Creation d'un compte anonyme:\nEntrez un solde:");
    					Scanner chaine2 = new Scanner(System.in);
    					String montantAnonyme = chaine2.nextLine();
    					solde = Float.parseFloat(montantAnonyme);
    					CompteAnonyme cba1 = new CompteAnonyme(solde);
    					cba1.affichageInfoCompte();
    					banque.add(cba1);
    					System.out.println("La liste contient " + banque.size() + " compte(s)");
    					menu();
     
     
    //.. supression d'un compte
    case 2:
    			Scanner chaine15 = new Scanner(System.in);
    			System.out.print("1-Supprimer un compte bancaire grace à son numero de compte\n2-Quitter\nentrez choix:");
    			String s2 = chaine15.nextLine();
    			choix1 = Integer.parseInt(s2);
    				switch(choix1){
    				case 1:
    					Scanner chaine16 = new Scanner(System.in);
    					System.out.print("Entrez un numero de compte");
    					String s3 = chaine16.nextLine();
    					compteAchercher = Integer.parseInt(s3);
     
    					if(banque.isEmpty()== false){
    						for(Iterator<CompteBancaire> iterator = banque.iterator();iterator.hasNext();){
    							if(compteAchercher == CompteBancaire.numeroDeCompte){
    								System.out.println("compte trouvé...");
    								banque.remove(iterator.next());
    								System.out.println("compte supprimé");
    							}
    							else{
    								System.out.println("compte non trouvé");
    							}
    						}
    					}
    					else{
    						System.out.println("Aucun compte n'est présent dans la liste");
    					}
    					System.out.println("La liste contient " + banque.size() + " compte(s)");
    					break;
    Merci à tous!

  6. #6
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Hello,

    Là encore ton erreur vient de ton utilisation incorrecte de l'Iterator.
    Il faut penser à récupérer l'instance courante de ta liste avec iterator.next() et travailler sur celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if(banque.isEmpty()== false){
            CompteBancaire compteIterator = null; //Creation d'une variable qui va contenir une instance de compte bancaire pour chaque passage de la boucle for.
    	for(Iterator<CompteBancaire> iterator = banque.iterator();iterator.hasNext();){
                compteIterator = iterator.next(); //recuperation de l'instance CompteBancaire fournit par l'Iterator
    	    if(compteAchercher == compteIterator.numeroDeCompte){ //ici on teste le numero de compte de l'instance fournit par iterator et pas CompteBancaire.numeroDeCompte
    			System.out.println("compte trouvé...");
    			banque.remove(compteIterator); //si le compte fournit par l'iterator correspond au numero de compte recherché, on le supprime
    			System.out.println("compte supprimé");
    	    }
    	    else{
                	System.out.println("compte non trouvé");
    	    }
    }
    Ce qu'il faut bien voir ici, c'est l'utilisation de next(), cette méthode va renvoyer l'élément contenu à sa position actuelle (comme un CompteBancaire[i] si c'était un tableau).
    En même temps elle fait avancer l'itérator d'un pas (un peu comme tu ferais avec i++ sur une boucle standard).
    Il faut donc bien penser à utiliser .next() à chaque passage de boucle pour pouvoir travailler sur l'élément courant rendu par l'iterator. Dans ton else tu n'avais pas de next(), tu ne faisais donc jamais avancer l'iterator d'où la boucle infinie.
    Il faut également prendre garde à ne pas l'appeler plus d'une fois à l'interieur de la boucle for sinon tu va sauter des éléments (équivalent d'appeler plusieurs i++ dans une seule boucle).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. parcours ArrayList avec remove plusieurs éléments
    Par hocdz dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 02/10/2009, 13h40
  2. Tri ArrayList d'object
    Par aristeas dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 21/11/2008, 17h17
  3. tri d'ArrayList d'Object[] sur un champ String
    Par igorzup dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 01/10/2008, 17h49
  4. Tri d'un arrayList d'Object[]
    Par Lex92 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 24/09/2008, 16h47
  5. Obtenir un Object[][] à partir d'une ArrayList d'object[]
    Par gufra dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/11/2007, 08h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo