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

Java Discussion :

problem method remove()


Sujet :

Java

  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Par défaut problem method remove()
    Bonjour a tous,

    Mon exercise me donne un faut code que je dois corriger. Je dois retirer d'un set tous les etudiants ayant un resultat de -1.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void removeFails() // cette methode est incorrecte
       {
          int resultsExam;
          for (String name: students.keySet())
          {
             resultsExam = this.students.get(name).getExamMark();
             if (resultsExam == -1)
             {
                students.remove(name);
             }
          }
    Maintenant je sais que l'on ne peut pas utiliser la method remove() sur un key.Set(), mais je ne vois pas comment approcher le problem differement

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Bonjour,

    Pour pouvoir supprimer des éléments d'une Map, il faut utiliser un Iterator.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	Iterator<String> it = students.keySet().iterator();
    	while (it.hasNext()) {
    		String name = it.next();
    		....
    	}

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Citation Envoyé par eric39 Voir le message
    Bonjour,

    Pour pouvoir supprimer des éléments d'une Map, il faut utiliser un Iterator.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	Iterator<String> it = students.keySet().iterator();
    	while (it.hasNext()) {
    		String name = it.next();
    		....
    	}
    Il utilise le for étendu, ce qui revient à utiliser l'itérateur non ?
    Je pense surtout que le problème ici est un ConcurrentModificationException. Tu peux utiliser une ConcurrentMap ou alors reconstruire une nouvelle Map au fur et à mesure.

    A plus

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Salut,

    Citation Envoyé par George7 Voir le message
    Salut,



    Il utilise le for étendu, ce qui revient à utiliser l'itérateur non ?
    Je pense surtout que le problème ici est un ConcurrentModificationException. Tu peux utiliser une ConcurrentMap ou alors reconstruire une nouvelle Map au fur et à mesure.
    Je suis d'accord pour le for étendu.
    En effet, le problème est bien une ConcurrentModificationException, mais l'Iterator solutionne ce genre de problème.
    J'aurais du ajouter la totalité du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Iterator<String> it = students.keySet().iterator();
    while (it.hasNext()) {
    	String name = it.next();
    	resultsExam = this.students.get(name).getExamMark();
    	if (resultsExam == -1) {
    		it.remove();
    	}
    }
    On peut comme celà accéder à l'intance de l'Iterator et faire un remove sur l'Iterator ce qui solutionne la ConcurrentModificationException.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ok si tu utilises le remove de l'iterator et pas celui de la Map...

  6. #6
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Par défaut problem remove
    Merci a tous pour votre reponse

    Je suis desole j'ai oublier de preciser que dans l'exercice ils precisent de garder le foreach loop

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par cyrodil Voir le message
    Merci a tous pour votre reponse

    Je suis desole j'ai oublier de preciser que dans l'exercice ils precisent de garder le foreach loop
    Alors dans ce cas, utilise une des deux possibilités que j'ai évoquées, ceci dit la solution de eric39 est aussi possible que tu pourras recycler pour une utilisation ultérieure

  8. #8
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Par défaut problem remove
    Je n'ai pas encore etudier concurrentMap, j'ai regarder sur le net et j'ai essaye d'implementer mon code le mieux possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void removeDropouts() 
       {
           Map<String, Integer> removeD = new HashMap<String, Integer>();
           for (String name: students.keySet())
          {
            if (removeD.get(name).equals(-1)) 
             {
                removeD.remove(name);
             }
          }
       }
    J'ai ajoute aussi java.util.concurrent.ConcurrentMap; a ma class, mais toujours rien

  9. #9
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Il faut utiliser une ConcurrentHashMap à la place d'une HashMap:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Map<String, Integer> removeD = new ConcurrentHashMap<String, Integer>();

  10. #10
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Par défaut problem remove
    Map<String, Integer> removeD = new ConcurrentHashMap<String, Integer>();
    for (String name: students.keySet())
    {
    if (removeD.get(name).equals(-1))
    {
    removeD.remove(name);
    }
    }

    Thanks eric39, I changed that, the student with -1 score is still on the list

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Euh, tu es sur qu'il n'y a pas une autre chose quelque part?
    Parce que le mécanisme est le bon...

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    En fait, dans le code que tu as donné,
    tu supprimes le éléments de la Map 'removeD', mais tu boucles sur 'students'.!!
    Remplace 'students' par 'removeD' dans ta boucle.

  13. #13
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Par défaut problem remove
    Je n'ai rien ajouter dans le constructor et rien dans les instances variables. Faut-il peut-etre que je declare removeD.

    Aussi l'exercise me donne le test pour la methode:

    TutorGroup t = new TutorGroup();
    t.populate();
    t.displayTutorGroup();
    t.removeDropouts();

    Ils fonctionnent tous sauf le dernier

  14. #14
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Par défaut
    J'ai remplacer la boucle students par removeB:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Map<String, Integer> removeD = new ConcurrentHashMap<String, Integer>();
          for (String name: removeD.keySet())
          {
             if (removeD.get(name).equals(-1)) 
             {
                removeD.remove(name);
             }
          }
    Cet etudiant est accroche a l'ecran, il veut pas partir

  15. #15
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Comment tu ajoutes les informations dans ta Map removeD?

  16. #16
    Invité
    Invité(e)
    Par défaut
    Ce que je ne comprends pas dans ton code, c'est que tu instancies removeD, sans le remplir et tu itéres dessus, donc ça ne fait rien. Ce que je voulais dire, c'est de changer le type de students (si tu le peux). Au moment de l'instancier au lieu de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    students = new HashMap<String, Integer>();
    tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    students = new ConcurrentHashMap<String, Integer>();
    Et le reste du code ne change pas apr rapport à ce que tu avais au début.
    Si tu ne peux pas changer le type de students (contrainte de l'énoncé par exemple...), alors la logique est inverse : tu ne retires rien, tu ajoutes les étudiants qui ont une note > -1 dans une nouvelle HashMap, et tu assignes à la fin students avec cette nouvelle HashMap remplie

    EDIT : à moitié grillé

  17. #17
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Par défaut Problem remove
    J'ai changer pour ConcurrentHashMap, mais ca ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void removeDropouts() 
       {
          Map<String, Integer> students = new ConcurrentHashMap<String, Integer>();
          int resultsExam;
          for (String name: students.keySet())
          {
             resultsExam = this.students.get(name).getExamMark();
             if (resultsExam == -1)
             {
                students.remove(name);
             }
          }

  18. #18
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    D'après ton code:
    Tu as déjà une variable qui s'appelle 'students' qui je pense est une variable d'instance de classe. C'est cette variable de classe qui doit devenir une ConcurrentHashMap.

    Dans le code que tu nous donnes, tu boucles sur une map vide!
    En gros la déclaration de la variable students dans la méthode ne sert pas.

  19. #19
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 53
    Par défaut problem remove
    Oui, mon variable est declare comme ceci:

    public class TutorGroup
    {
    /* instance variables */
    private SortedMap<String, Student> students;

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Par défaut
    Tu peux essayer ce bout de code, c'est ce que je fais généralement quand j'ai plusieurs chose à supprimer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    HashMap<String, Integer> removeD = new HashMap<String, Integer>();
    Set<String> setToRemove = new HashSet<String>();
    for (String name : removeD.keySet()) {
    	if (removeD.get(name).equals(-1)) {
    		setToRemove.add(name);
    	}
    }
    removeD.keySet().removeAll(setToRemove);
    A+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Probleme methode repaint()
    Par cybercrisp dans le forum AWT/Swing
    Réponses: 14
    Dernier message: 24/10/2006, 23h21
  2. [FLASH 8] Probleme méthode send de LoadVars
    Par dom_dev dans le forum Flash
    Réponses: 11
    Dernier message: 26/09/2006, 12h07
  3. Réponses: 2
    Dernier message: 23/08/2006, 15h47
  4. probleme methode="post"
    Par ardamus dans le forum Langage
    Réponses: 8
    Dernier message: 01/03/2006, 11h30
  5. Probleme Methode POST
    Par pidu dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/02/2006, 17h33

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