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 :

[Java 1.4] Problème avec un ArrayList ? (contains)


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Par défaut [Java 1.4] Problème avec un ArrayList ? (contains)
    Bonjour.
    J'ai (peut-être) un soucis avec un arraylist de String mais je n'en suis pas sur...

    J'utilise un bout de code qui ressemble à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ArrayList maListe = new ArrayList();
    String monCode = "F0001";
    if (maListe.contains(monCode)==false) maListe.add(monCode);
    String monCode2 = "F0001";
    if (maListe.contains(monCode2)==false) maListe.add(monCode2);
    Bien sur il y a une boucle et monCode et monCode2 changent. Le but est de n'avoir qu'une seule fois chaque code. Dans l'exemple que je donne l'arrayList ne contient qu'un seul code et une seule fois.

    Ça fonctionne mais la nuit dernière on a eu un gros traitement, en gros il devait y avoir 350.000 code dans l'arrayList, et on a eu 90.000 doubles... (enfin double... sextuple, octuple etc). Donc 440.000 code au total.

    Je sais que contains ça peut poser problème car arrayList contient des objets et la vérification se fait avec equals. Et ce n'est pas parce que 2 string ont la même valeur que c'est le même objet.
    En java 1.5 et au delà on mettrait <String> devant l'arraylist mais ce mécanisme n'existe pas en 1.4.
    Et impossible de reproduire le problème de double avec un volume "classique" (d'habitude c'est 1000 codes par traitement)

    Le truc que je ne comprend pas c'est qu’apparemment ça fonctionne sauf avec un gros volume...
    Soit j'ai un problème avec le contains soit j'en ai pas mais le comportement devrait être le même indépendamment du volume...

    Est ce que j'utilise correctement l'arrayList avant de chercher dans une autre direction ?

  2. #2
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String valeur= "F0001";
    private ArrayList<String> maListe = new ArrayList<String>();
    this.maListe.add(valeur);
    if(this.maListe.contains(valeur)) {
    // traitements
    }else{
       this.maListe.add(valeur);
    }

  3. #3
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Tu n'ajoutes que des chaînes de caractère?
    Comment sont-elles construites?


    Si tu veux ne pas avoir à vérifier la présence d'un élément avant de l'ajouter et que tu ne veux pas d'éléments en double, utilises un Set (HashSet par exemple).

    Normalement, quel que soit le mode de construction, le contains fonctionne en vérifiant le hashCode et le equals de chaque élément. Donc pour des objets String, si deux valeurs sont identiques, elle devraient être considérées comme égales.

    Si tu stockes autre chose, je peux pas dire...

    Tu es sûr de toi par rapport à la casse? A la présence d'espace avant/après? Au nombre de threads qui essayent d'ajouter des éléments à ta liste?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Aussi, est-ce que ce ne seraient pas des String dans des langues non latines, avec de nombreux modificateurs unicodes? Il existe malheureusement plusieurs manière de représenter le même texte (visuel) en unicode. Par exemple, le caractère "é" peut aussi bien être représenté "è" que "`" + "e". Le premier fait un char, le second fait 2 chars. Les deux String ne sont pas égales au sens de java, mais ont la même représentation. Le typage générique ne change rien au comportement de ArrayList, c'est juste du sucre.

    Donc si tu es dans le cas de ce genre de texte, et que la réprésentation visuelle prime sur la représentation binaire, tu va devoir passer tes string à la moulinette du Normalizer java

    https://docs.oracle.com/javase/tutor...alizerapi.html

    Au final faudrait ton code et la représentation binaire des strings doubles pour voir où est le problème.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Par défaut
    Les codes sont alphanumériques, c'est des lettres et des chiffres sans accents.
    J'ai effectivement pensé à un problème de casse, mais ces codes viennent d'une base de données et sont tous stockés avec la même casse (théoriquement)
    Je ne stocke que des strings.
    Logiquement un seul thread se charge de ça (à vérifier toutefois !)

    Je vais voir avec le set, le soucis c'est que je n'arrive pas à reproduire le soucis sur mon poste de développement.

    En tout cas théoriquement d'après vos message je ne fais pas une mauvaise utilisation du contains, le soucis doit donc venir d'ailleurs. Soit il y a plusieurs thread, soit à un endroit j'alimente la liste sans vérification de la présence de double, soit le code récupéré n'a pas la bonne casse pour une raison quelconque.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    a titre de test, tu peux faire ceci pour créer ta liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    List<String> laListe = new ArrayList<String>(){
       @override
       public boolean add(String e){
          if (contains(e)){
              throw new RuntimeException("Hé ho ca existe déjà");
          }
          return super.add(e);
       }
    }

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par PaladinFr Voir le message
    En tout cas théoriquement d'après vos message je ne fais pas une mauvaise utilisation du contains,
    Attention, tu fais quand même une utilisation inefficace de contains(), en utilisant une List au lieu d'un HashSet par exemple. Cela fait des parcours de liste bien inutiles et longs.
    Le résultat obtenu après tout ce temps gâché, par contre, devrait être celui attendu en s'en servant comme ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Problème avec des ArrayList
    Par pony99 dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 22/12/2011, 18h00
  2. Problème avec la fonction : CONTAINS
    Par kmdkaci dans le forum SQL
    Réponses: 6
    Dernier message: 01/06/2011, 14h49
  3. problème avec la fonction contains()
    Par vhenin dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 31/08/2010, 16h26
  4. [XSLT] Problème avec la fonction contains
    Par yozart dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 24/11/2008, 14h57
  5. Problème avec un ArrayList
    Par LeNovice dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 03/03/2007, 23h12

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