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 :

Set avec un get(Object o)


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut Set avec un get(Object o)
    Qui aurait une classe Set avec une methode get() -dans l'API 5 si possible ?

    Je suis à la recherche d'un ensemble (... implements Set) qui me permet de retourner l'objet obj qui existe déjà dans l'ensemble (en terme de HashCode, de comparator() et de equals():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Set ensemble=new setAvecGetSet();
    ...
    MyObject obj10a=new MyObject(10);
    ensemble.add(obj10a);
    ...
    MyObject obj10b=ensemble.get(new MyObject(10));
    ...
    avec obj10b.equals(obj10a) retourne true.

    Par avance merci.

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class SetAvecGet extends HashSet {
     
      public Object get(Object o) {
        return contains(o) ? o : null;
      }
    }

  3. #3
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Dans ce cas, je dois créer un superclasse de HashSet (qui implements Set) et lui ajouter la méthode get(Object o).

    Mais le principe de retrouner l'objet soumis s'il existe dans le Set ne me convient pas. Par le get(), je voudrai retourner l'objet du Set ayant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(objet_dans_le_set.equals(objet_soumis)==true)
      return objet_dans_le_set;
    qui est différent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        return contains(o) ? o : null;
    Je recherche cela car j'ai un ensemble d'objets prépositionnés, et je voudrais en extraire l'équivalent en soumettant uniquement les paramtères nécaissaires à sa détermination de cela que je souhaite extraire.

  4. #4
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    if(objet_dans_le_set.equals(objet_soumis)==true)
    return objet_dans_le_set;
    s'ils sont "equals" peu importe de retourner "objet_soumis" ou "objet_dans_le_set" !

  5. #5
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Non ! Pas forcement !

    Prenons le cas...
    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
     
    public class Obj{
      public long id=0;
      private String nom="";
     
      public Obj(long id, String nom){
        this.id=id;
        this.nom=nom;
      }
     
      @override
      public boolean equals(Object o){
        if(o!=null  && o instanceOf Obj)
          return (o.id==this.id);
        return false;
      }
    }
    je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Set set=new HashSet();
    [...]
    Obj obj=new Obj(10,"Lorantus");
    set.add(obj);
    Je souhaite retourner l'objet new Obj().id=10 (je connais pas "nom", c'est pour cela que donne que le "id", qui est une sorte de clef -dans le .equals). Alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Obj obj=set.get(new Obj(10,null));
    dois me retourner l'objet Obj(10,"Lorantus") que j'ai mis précédement, pas celui que je donne pour la méthode...

    Vois-tu la différence entre "objet_soumis" et "objet_dans_le_set" ?

    Par avance, merci.

  6. #6
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Donc, pour toi, les deux objets suivants sont égaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    new Obj(10,"Lorantus");
    new Obj(10,"Herve");
    ?
    C'est pour le moins étrange.
    A mon avis il faudrait procéder autrement, ce dont tu as besoin c'est d'une map d'association entre l'id d'une part, et les informations associées d'autre part.
    Soit qq chose comme ça :
    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
    private Map objById = new HashMap();
     
    public void register(Obj o) {
      objById.put(new Long(o.id), o);
    }
     
    public Obj retrieve(int id) {
      return (Obj ) objById.get(new Long(id));
    }
    ...
    Obj obj1 = new Obj(10,"Lorantus");
    register(obj1);
    ...
     
    Obj obj2 = retrieve(10); // qui te renvoie obj1

  7. #7
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Voilà, c'est cela.

    Ben, la question, elle porte sur l'existance d'une API du JDK Set/Map permettant de faire cela... sinon il va falloire faire une classe d'extension. J'ai rien contre, mais si une API existe dans le JDK, ce serait tellement mieux, non ?

    Certe, cela peut paraître étrange que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    new Obj(10,"Lorantus");
    new Obj(10,"Herve");
    soit égaux. Mais dans le fond, l'égalité.... ==, equals.... la définition est relative à un environnement donnée.... nous jouons dessus ... C'est un système à clef -type DDB et que id et la clef primaire, je dirais.... les deux sont égaux : ils ont le même id -clef.

  8. #8
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    S'ils sont égaux, lequel privilégier ???
    Le code que je te propose ne te convient pas ? Ta modélisation est erronée et sujette à de nombreux bugs en perspective !
    Bien sûr il faut modifier equals() pour prendre en compte l'attribut "nom".

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Imagine qu'il veuille utiliser le Set comme un pool d'objets représentant des entités (au sens EJB3), ça démarche a un sens.
    Il a un objet du même type dans un autre contexte, il vérifie que l'objet n'est pas déjà dans le pool, mais si c'est le cas, il récupère celui du pool (qui sera, je suppose, mis à jour si nécessaire)
    Bref, ce n'est pas forcément naze

    A+

  10. #10
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Imagine qu'il veuille utiliser le Set comme un pool d'objets
    C'est une bonne définition.... un pool dans le Set/Hash... et biensur, priviligier celui qui est dans le pool.

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/11/2011, 18h30
  2. Creer des methodes Get et Set avec c#
    Par loviso dans le forum C#
    Réponses: 4
    Dernier message: 04/08/2009, 11h19
  3. [VB6]Property Get/Set avec groupe de contrôles
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/01/2006, 12h09
  4. probleme avec methode get
    Par Tr@nkill dans le forum ASP
    Réponses: 2
    Dernier message: 12/05/2005, 13h54
  5. Désinstaller un logiciel installer avec apt-get ?
    Par piff62 dans le forum Debian
    Réponses: 2
    Dernier message: 23/02/2005, 18h44

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