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 :

TreeSet est un menteur !


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut TreeSet est un menteur !
    Bonjour à tous, si vous cherchez dans l'api vous trouvez ceci piur la méthode contains de java.util.TreeSet :
    contains

    public boolean contains(Object o)

    Returns true if this set contains the specified element.

    Specified by:
    contains in interface Set
    Overrides:
    contains in class AbstractCollection

    Parameters:
    o - the object to be checked for containment in this set.
    Returns:
    true if this set contains the specified element.
    Throws:
    ClassCastException - if the specified object cannot be compared with the elements currently in the set.
    En suivant le lien vers Set on trouve ceci :
    contains

    public boolean contains(Object o)

    Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).

    Specified by:
    contains in interface Collection

    Parameters:
    o - element whose presence in this set is to be tested.
    Returns:
    true if this set contains the specified element.
    Throws:
    ClassCastException - if the type of the specified element is incompatible with this set (optional).
    NullPointerException - if the specified element is null and this set does not support null elements (optional).
    Et pourtant en fouillant les sources on tombe sur ceci :
    TreeSet#contains(Object o) délègue à la TreeMap#contaisnKey(Object k) qui utilise le résultat de TreeMap#getEntry(Object k) qui utilise TreeMap#compare(Object k1, Object k2) qui fais appel à la méthode Comparable#compareTo(Object o)

    donc l'API nous ment. TreeSet utilise compareTo et pas equals.

    des réactions ? ou me suis-je gourré ?

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Dans l'API de TreeSet on peut lire ceci :
    Note that the ordering maintained by a set (whether or not an explicit comparator is provided) must be consistent with equals if it is to correctly implement the Set interface. (See Comparable or Comparator for a precise definition of consistent with equals.) This is so because the Set interface is defined in terms of the equals operation, but a TreeSet instance performs all element comparisons using its compareTo (or compare) method, so two elements that are deemed equal by this method are, from the standpoint of the set, equal. The behavior of a set is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Set interface.
    Bref TreeSet utilise compareTo() alors que les Set devraient utiliser equals(), et ainsi pour respecter les spécificité du Set il faut que compareTo() doit être cohérent avec equals() (bref si a.equals(b) alors a.compareTo(b)==0 et inversement).


    C'est juste une spécificité d'une implémentation... et l'API de Collections est pleine de spécificité

    a++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ok, n'empêche ils auraient pu être plus clair dans leur commentaires de méthode. Enfin merci pour l'info, maintenant je ferais plus attention lorsque je coderais un objet Comparable

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

Discussions similaires

  1. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 14h52
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. Quelle est la fiabilité du protocole SSL ?
    Par Anonymous dans le forum Développement
    Réponses: 5
    Dernier message: 05/09/2002, 13h31
  4. apprentissage du C est-il necessaire pour C++ ?
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 02/05/2002, 12h56
  5. C'est quoi exactement un générateur d'états
    Par Henry Cesbron Lavau dans le forum Outils de restitution et d'analyse
    Réponses: 0
    Dernier message: 02/04/2002, 19h15

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