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 :

Supprimer depuis ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 43
    Points
    43
    Par défaut Supprimer depuis ArrayList
    bonjour
    je souhaite votre aide

    CODE 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ArrayList<StringBuilder> myArrList = new ArrayList<>();
    StringBuilder sb1 = new StringBuilder("One");
    StringBuilder sb2 = new StringBuilder("Two");
    StringBuilder sb3 = new StringBuilder("Three");
    StringBuilder sb4 = new StringBuilder("Four");
    myArrList.add(sb1);
    myArrList.add(sb2);
    myArrList.add(sb3);
    myArrList.add(sb4);
    myArrList.remove(new StringBuilder("Four")); 
    for (StringBuilder element : myArrList) 
    System.out.println(element); 
    }
    code 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    ArrayList<String> myArrList = new ArrayList<>();
    String sb1 = new String("One");
    String sb2 = new String("Two");
    String sb3 = new String("Three");
    String sb4 = new String("Four");
    myArrList.add(sb1);
    myArrList.add(sb2);
    myArrList.add(sb3);
    myArrList.add(sb4); 
    myArrList.remove(new String("Four")); 
    for (String element : myArrList) 
    System.out.println(element);
    Pourquoi le premier code affiche One Two Three Four
    et le deuxième code affiche One Two Three
    merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Pour la même raison que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myArrList.contains(new StringBuilder("Four"));
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myArrList.contains(new String("Four"));
    ne renverraient pas la même chose.
    Et forcément, une List ne peut pas enlever un élément qu'elle ne contenait pas déjà.

    Le premier contains() renvoie faux parce que deux objets StringBuilder distincts (créés chacun avec son propre "new") ne sont jamais égaux. Alors que deux String distinctes sont égales si elles contiennent les mêmes caractères au même endroit.

    Quand je dis "des objets égaux" je veux dire "de sorte que la méthode equals() de l'un appliqué à l'autre renvoie true."
    C'est sur cette méthode equals() que compte ArrayList pour reconnaître si un objet qu'on lui passe en paramètre, correspond à un objet qu'elle contient.

    Du coup, la méthode remove() ne reconnaît pas un new StringBuilder() que tu lui passes : étant un nouvel objet distinct, il ne sera jamais égal à rien qui existait avant lui.
    Par contre elle reconnaît sans problème une new String(), qui est égale à toute autre String qui contient la même chose.


    Je ne sais pas trop pourquoi StringBuilder.equals() fait en sorte de ne jamais être égal à un autre StringBuilder. Probablement parce qu'un StringBuilder est censé, par nature, changer de contenu tout le temps, et que même si deux StringBuilders contenaient la même chose ou pas la même chose à un moment, ça pourrait très bien avoir changé quelques instructions plus tard. Selon cette logique, compter sur StringBuilder.equals() serait encourager les bugs, et il vaudrait mieux juste ne jamais le faire.
    Je ne trouve pas que ce soit le cas, mais bon. Ce qui est fait, est fait.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Bonjour,

    La différence se fait sur la méthode equals() des classes String et StringBuilder.

    Si on se penche de plus près sur la méthode equals() de la classe String, on constatera que la méthode va tester un par un tous les caractères de notre chaine.

    Si on se penche sur la classe StringBuilder, on remarquera que ni cette classe ni sa classe mère (AbstractStringBuilder il me semble), ne reprends la méthode equals(). Cela signifie donc que c'est la méthode de la classe Object qui est utilisée. La méthode equals() de la classe Object test si les adresses mémoires des deux objets sont identiques.

    Dans ton deuxième cas le remove enlève le 4ème objet comme prévu car les deux chaines de caractères sont identiques. Mais dans ton premier cas, utilisé le mot clé "new" va créer un nouvel emplacement mémoire, et la méthode equals() appelé test les emplacements mémoires plutot que le contenu de la chaine de caractère. Il considère donc ton "sb4" comme un objet différent de ton "new StringBuilder('Four')".

    En esperant avoir pu t'aider.

    --Momoth--
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  4. #4
    Membre du Club
    Étudiant
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 43
    Points
    43
    Par défaut
    merci M thelvin et Momoth de l'explication .

    j'ai chercher dans les api de java 7 j'ai pas trouver la méthode equals et hashcode dans la classe StringBuilder .
    StringBuilder ne redéfinit pas la méthode Object.equals ().

    Alors la méthode equals pour une StringBuilder va comparer les références d'objet.
    même chose pour StringBuffer.
    je crois parce que StringBuffer et StringBuffer sont mutable et son utilisation principale est de construire des chaînes. Si vous voulez comparer le contenu, appeler toString () et comparer la valeur retournée.

    la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    StringBuilder s1=new StringBuilder("john");
    StringBuilder s2=new StringBuilder("john ");
     
    System.out.println(s1.toString().equals(s2.toString()));
    résultat : true

    merci

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Tout à fait. Mais ça ne résout pas ton problème d'enlever des éléments des ArrayList<StringBuilder>.

    L'idéal serait d'avoir des ArrayList<String> si possible... Mais il y a des cas où on a vraiment besoin de stocker des StringBuilder et d'en enlever quand ils ont un certain contenu.

    Dans ce cas, quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /**
     * @returns le StringBuilder retiré s'il y en a un qui correspond,
     * ou null si aucun Stringbuilder ne contenait la String demandée.
     */
    public static StringBuilder removeStringBuilderContaining(ArrayList<StringBuilder> list, String content) {
      for(int i = 0; i < list.size(); i++) {
        StringBuilder builder = list.get(i);
        if(builder.toString().equals(content)) {
          list.remove(i);
          return builder;
        }
      }
      return null;
    }
    Ou plus général :

    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
    /**
     * @returns le StringBuilder retiré s'il y en a un qui correspond,
     * ou null si aucun Stringbuilder ne contenait la String demandée.
     */
    public static StringBuilder removeStringBuilderContaining(Collection<StringBuilder> collection, String content) {
      Iterator<StringBuilder> itr = collection.iterator();
      while(itr.hasNext()) {
        StringBuilder builder = itr.next();
        if(builder.toString().equals(content)) {
          itr.remove();
          return builder;
        }
      }
      return null;
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Étudiant
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 43
    Points
    43
    Par défaut
    merci M thelvin

    vraiment ici chaque jours je prendrai beaucoup de chose

    merci

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

Discussions similaires

  1. Supprimer un objet d'une ArrayList, depuis l'objet
    Par seb2501 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 08/06/2012, 09h52
  2. Réponses: 7
    Dernier message: 16/05/2006, 15h40
  3. [Collections] Mixer plusieurs ArrayList en supprimant les doublons
    Par vallica dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 16/05/2006, 15h01
  4. [MySQL] Plusieurs enregistrement à supprimer depuis un checkbox
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 26/12/2005, 14h08
  5. [Collections]Supprimer des doublons dans une ArrayList
    Par emie31 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2005, 15h15

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