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 :

[Vector] Tester le type d'un élément


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut [Vector] Tester le type d'un élément
    Bonjour (bonsoir),

    Je cherche actuellement un moyen de tester le contenu d'un vecteur. Le problème (disons pour moi) est qu'il peut contenir soit un float soit un nouveau vecteur.

    Comment dois-je m'y prendre pour la comparaison ?

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(int i = 0; i < tailleListe(); i++)
        {
                Object currentElement = liste.get(i);
                if((Float) currentElement == java.sql.Types.FLOAT)
                    chaine += currentElement;
                else 
                {
                    Class cls = currentElement.getClass();
                    if(cls.isArray())
                        chaine += listeEnChaine((Vector) currentElement);
                }
     
        }
    Pour la comparaison de types je vois pas trop comment le faire

  2. #2
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut
    Je viens de faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(int i = 0; i < liste.size(); i++)
        {
                Object currentElement = liste.get(i);
                if(currentElement.getClass().isArray())
                    chaine += listeEnChaine((Vector) currentElement);
                else
                {
                    chaine += currentElement;
                }
        }
    Ca vous parait correct ??

  3. #3
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut instanceof ?
    Salut! Tu dois connaitre la condition instanceof normalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Vector v = new Stack(); // c'est plus efficace paraît-il, c'est une sous-classe
    E e = new E(); // E pour n'importe quelle classe
    v.add(element);
    v.add(new Vector());
    Object o = null;
    //(...)
    while(v.peek() != null) {
      if((obj = v.pop()) instanceof Vector) 
              //ce que tu veux en faire du Vecteur, recursif?
               obj;
       else // ce que tu veux garder... ? ici c'est pas un vecteur
            obj;
    }

  4. #4
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut
    En fait je suis limité au classe vector, list. Le reste n'est pas trop autorisé.

    Et pour info j'ai un vecteur contenant des éléments qui peuvent être soit un float, soit une chaine, soit un vecteur. Le seul problème que j'ai c'est que je veux pouvoir parcourir tout le vecteur ainsi que ceux qui sont dans le vecteur lui même. Et donc il faudrait que je teste pour savoir si vecteur ou pas

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Dans ton cas le problème est qu'instanceof ne gère pas les types primitifs. Enfin ce n'est pas un problème non plus car ton vecteur ne contient pas de type primitif mais des Objets. Donc si tu ajoutes à ton vecteur un int tu auras dans les faits un Integer dans ton Vecteur (java planque ce mécanisme depuis la version 1.5, avant il fallait procéder à la mimine et ajouter un Integer à ton Vector).

    D'ailleurs il vaut mieux en général utiliser une List qu'un Vector (qui est une classe déconseillée, mais qui n'est pas deprecated à cause des multiples utilisations de Vector, en particulier dans Swing).

    Sinon en général il est recommandé d'éviter de mettre des objets hétérogènes dans une même collection en prog objet, que ce soit java ou C++ ou C# ou smalltalk. Il existe toujours des solutions pour contourner ceci. (par exemple créer une collection d'objet qui gère en interne les multiples valeurs possibles pour les éléments de la collection).
    Donc je dirais avant tout que ton problème est situé au niveau de la conception.

    Sinon pour faire ce que tu voulais je préconiserai ceci:





    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
    18
    19
    
    List<Object> l = new ArrayList<Object>();
    l.add("a");
    l.add(1); //si tu es en 1.5 ça marche (cf autoboxing/unboxing voir la FAQ pour comprendre), sinon new Integer(1) a la place s
    l.add(new Vector());
    Object o = null;
    StringBuffer chaineDest = new StringBuffer();  //Classe optimisée pour les append car non mutable au contraire de String qui est immuable cf tuto de gfx 
    for(int i = 0; i<l.size(); i++) { //l'ArrayList est optimisée pour être utilisée avec des boucles for, dans le cas d'un linkedList par exemple mieux vaut passer par un Iterator
       Object o = l.get(i);
       if( o instanceof List){
          surementFaireDuRecursif(chaineDest);
       } else {
          chaineDest.append(o.toString(); //vrai tout le temps vu que tu manipules des objets.
       }
    }
    
    return chaineDest.toString(); //renvoie la chaine correspondant au contenu du buffer
    

  6. #6
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Par défaut
    Merci pour cette réponse mais tu as précisé dans le code que ce sera vrai tout le temps. Il y a pas moyen de faire mon récursif que si je suis tombé sur un Vector ?

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    c'est le o.toString qui marchera à tous les coups désolé le "vrai" était mal choisi comme expression ^^ désolé, en fait c'est vrai tout le temps, sauf que séquentiellement tu as déja testé si tu avais une List (d'ailleurs Vector implémente l'interface List) donc le cas List ne sera pas possible dans le else

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

Discussions similaires

  1. [XSLT 2.0] Tester le type d'un élément XSLT
    Par LaBastoss dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 16/11/2011, 12h12
  2. Tester le type d'un élément
    Par myrddin772 dans le forum VBA Outlook
    Réponses: 5
    Dernier message: 18/03/2008, 08h16
  3. Tester le type de l'élément
    Par Mister Nono dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/10/2006, 11h16
  4. Réponses: 10
    Dernier message: 18/11/2003, 18h01
  5. [VB6] [Interface] Tester le Type de Controle
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/09/2002, 09h51

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