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

Langage Java Discussion :

Filtrer une liste de classes


Sujet :

Langage Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 156
    Points : 165
    Points
    165
    Par défaut Filtrer une liste de classes
    Bonjour,

    J'ai une liste d'objets différents dans une ArrayList et je souhaite la parcourir pour en extraire tous ceux qui sont d'une certaine classe (et de ses classes dérivées).

    Par exemple j'ai une ArrayList qui contient un objet de la classe Integer, un de la classe InputStream et un de la classe AudioInputStream.

    Je voudrais faire une méthode
    ArrayList filter(ArrayList toFilter, Class classFilter) { } qui si je lui passe InputStream.getClass() en paramètre me renvoie une ArrayList avec l'objet de la classe InputStream et celui de la classe AudioInputStream (puisque héritée de de InputStream).

    Mon problème vient du fait que je n'arrive pas à comparer deux Class. Une méthode du type ArrayList filter(ArrayList toFilter, Object classFilter) { } pourrait fonctionner puisqu'il suffirait de faire un instanceof entre chacun des objets de "toFilter" et classFilter.getClass() pourrait résoudre le problème mais la solution n'est pas très élégante puisque je dois instancier l'objet à passer au filtre. Je souhaiterais donc un moyen de filtrer avec une méthode de type "ArrayList filter(ArrayList toFilter, Class classFilter)".

    Merci d'avance à tous ceux qui pourraient me donner un moyen de faire ça.

  2. #2
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    le principe est de parcourir la liste et de tester pour chacun des element le type par reflexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ArrayList filter(ArrayList toFilter, Class classFilter) {
    java.util.ArrayList retour = new java.util.ArrayList();
    for(java.util.Iterator ite = toFilter.iterator();ite.hasNext()) {
        Object obj = ite.next();
        if(obj instanceof classFilter) {
            retour.add(obj);
        }
    }
    return retour;
    }

  3. #3
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Salut, tu peux comparer 2 classes suivant leur nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ArrayList filter(ArrayList toFilter, Class classFilter) 
    { 
     if( toFilter.get(0).getClass().getName().equals( classFilter.getName() ) ) {
       ...
     }
    }
    Mais je sais pas comment, à partir de là, récupérer aussi les classes filles.

    ++

  4. #4
    Membre actif Avatar de tnodev
    Profil pro
    SSSSS
    Inscrit en
    Mai 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : SSSSS

    Informations forums :
    Inscription : Mai 2005
    Messages : 182
    Points : 231
    Points
    231
    Par défaut
    Salut

    dans les commons-collection, tu as :


    Et hop en deux lignes, c'est fait...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 156
    Points : 165
    Points
    165
    Par défaut
    Merci pour vos réponses.

    @fnobb : j'avais essayé comme ça au début mais ça ne fonctionne pas. Eclipse me trouve une erreur "classFilter cannot be resolved to a type" ce qui donne à penser qu'il attend bien un nom de classe à droite et non un objet de type Class.

    @schniouf : effectivement ça ne résous pas le problème des sous-classes, c'est dommage.

    @tnodev : La méthode evaluate à l'air de répondre tout à fait à mes besoins. Merci

  6. #6
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour

    et ça ?

    http://java.sun.com/j2se/1.5.0/docs/...va.lang.Object)

    C'est la doc 1.5 mais j'imagine que ça existe aussi en 1.4.

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Une méthode est faite pour ça dans l'API Java standard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(InputStream.class.isAssignableFrom(classFilter))
        ...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 156
    Points : 165
    Points
    165
    Par défaut
    Effectivement ça à l'air de fonctionner aussi (je n'ai testé que la première des deux méthodes, j'ai juste été voir la JavaDoc pour l'autre).

    En fait j'avais déja essayé la méthode isInstance() mais comme elle prennait un objet en paramètre je pensais que ce n'était pas ce que je cherchais. Alors qu'en fait l'ordre est inversé par rapport à instanceof. J'aurais du réfléchir un peu plus sur ce coup là

    Merci en tout cas pour ces deux dernières solutions.

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

Discussions similaires

  1. Filtrer une liste
    Par skorpio dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2007, 16h36
  2. Réponses: 3
    Dernier message: 24/05/2007, 11h23
  3. filtrer une liste en fonction d'une valeur
    Par robocop2776 dans le forum Access
    Réponses: 4
    Dernier message: 06/04/2007, 10h13
  4. Filtrer une liste déroulante
    Par Gone 23 dans le forum IHM
    Réponses: 7
    Dernier message: 20/03/2007, 14h06
  5. Impossibilité de filtrer une liste déroulante
    Par lito74 dans le forum Access
    Réponses: 12
    Dernier message: 27/02/2006, 11h03

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