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

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Points : 74
    Points
    74
    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 habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    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 habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    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 régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Points : 74
    Points
    74
    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 régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Points : 74
    Points
    74
    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 habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    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).

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Points : 74
    Points
    74
    Par défaut OK
    J'ai testé avec les conseils que tu m'as donné la boucle infinie n'est plus présente mais je n'arrive qu'a supprimer le dernier élement entré dans la liste. Si j'essaye d'entrer un autre élément cela m'affiche :"compte non trouver..." X fois X étant le nombre de compte enregistré au préalable.

  8. #8
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    salut,

    est-ce que l'attribut numeroDeCompte de la classe CompteBancaire est static??

    tu pourrais poster le code de CompteBancaire pour voir comment tu gères les numéros de compte?

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Points : 74
    Points
    74
    Par défaut CompteBancaire
    Salut,
    oui mon attribut numeroDeCompte est un attribut de classe il est en static.

    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
    package frunivcezanne.sircoulomb.banque;
     
    public class CompteBancaire {
     
    //------------------------------------------------Variable d'instance
     
    	protected float solde = 0;
    	protected static int numeroDeCompte  = 100000000 ;
    	protected static int compteur = 1;
    	protected int compteurTableau = 0;
     
    //------------------------------------------------Constructeur CompteBancaire
    	public CompteBancaire()
    	{
    		solde = 0;
    		numeroDeCompte++;
    	}
     
    //------------------------------------------------------------------------------renvoi le numero de compte
    	public int getNumeroDecompte(){
    		return numeroDeCompte;
    		}
     
    //------------------------------------------------------------------------------renvoi le solde
    	public float getSolde(){
    		return solde;
    		}
     
    //------------------------------------------------------------------------------modification du solde
    	public void setSolde(float s){
    		solde = s;
    		}
     
    //------------------------------------------------------------------------------renvoi le solde
    	public int getCreationCompteNumero(){
    		return compteur;
    		}
     
    	public void depot(float montant) throws Exception{
    		 solde += montant;
    	}
     
    	public void retrait(float montant) throws Exception{
    		solde -= montant;
    	}
     
     
    //------------------------------------------------------------------------------Virement: retrait du compte cb1 et depot sur le compte cb2
    	public static void virement(CompteBancaire cb1, CompteBancaire cb2, float montant)throws Exception {
     
    		cb1.depot(montant);
    		cb2.retrait(montant);
     
    	}
    }
    voici le code de CompteBancaire. Il faut savoir aussi que 4 classes (CompteAnonyme, CompteClassique, CompteRamunere, ComptePlacement) heritent de cette classe CompteBancaire.
    Veux tu que je poste les autres classe aussi?
    Merci de ton aide!

  10. #10
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    salut,

    il ne trouvait que le dernier élément parce que le numero de compte est static, et donc tous les objets CompteBancaire partagent le même numéro.

    par exp, à la création du premier compte, numeroCompte = 1
    à la création du deuxième compte, numeroCompte = 2, c'est bon, mais c'est le cas pour tous les comptes créés, donc même le premier compte aura comme numero le 2

    donc, essaie en enlevant l'attribut static du numeroCompte

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Points : 74
    Points
    74
    Par défaut CompteBancaire
    Mais si je supprime le static de ma variable numeroDeCompte toutes mes intances de CompteBancaire auront le même numero de compte non?

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    au contraire, le static fait que toutes tes instances partagent cette valeur!

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Points : 74
    Points
    74
    Par défaut CompteBancaire
    Oui tout à fait d'accord, mais justement à chaque instance (dans mon constructeur) j'incrémentais de 1 mon "numeroDeCompte" pour que toutes mes instance de compte est un numeroDeCompte different. Si je supprime le static il auront tous le même numero de compte non ? ou alors j'ai vraiment mal compris la notion de static et si c'est le cas pourriez vous me l'expliquer brièvement?

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu l'incrémente, mais comme elle est statique, tout les compte on la nouvelle valeur, donc t'as en rien résolu le problème. Le mieux est de passer le numéro de compte en paramètre du constructeur, et c'est celui qui crée les compte qui s'assure de l'unicité de ceux-ci

  15. #15
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    une autre proposition de solution

    tu enlève le static de numeroDeCompte, puisque cette variable doit avoir une valeur propre à chaque instance, et donc elle ne peut être un attribut de classe, et tu crée un attribut nombreDeCompteCree qui est static, et tu l'incrémentes dans le constructeur, et puis tu ajoutes sa valeur à numeroDeCompte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected int numeroDeCompte  = 100000000 ;
    protected static int nombreDeCompteCree = 0;
    ,,,
    public CompteBancaire()
    {
    	solde = 0;
    	nombreDeCompteCree++;
           numeroDeCompte += nombreDeCompteCree;
    }
    ,,,
    exemple:

    --Construction du premier CompteBancaire :
    nombreDeCompteCree = 1
    numeroDeCompte = 100000000 + 1
    --Construction du deuxième CompteBancaire :
    nombreDeCompteCree = 2 ( c'est la même valeur qu'aura le premier CompteBancaire, puisque nombreDeCompteCree est static )
    numeroDeCompte = 100000000 + 2 ( numeroDeCompte n'est pas static, donc ce ne sera pas la même valeur que le premier CompteBancaire )
    ...

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 177
    Points : 74
    Points
    74
    Par défaut ok résolu
    Ok that's it merci de votre aide

+ 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