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 :

Casting nécessaire à chaque niveau d'imbrication d'Object / Q & S


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut Casting nécessaire à chaque niveau d'imbrication d'Object / Q & S
    Chers fieffés de Java,
    Il s'agit
    - d'une question dont j'ai trouvé la solution, mais dont je me demande pourquoi "il faut pousser aussi loin".
    - d'éléments String d'une array-source (de libellés), statique et à multiples dimensions, qui sont lus un à un pour être insérés dans une array-cible (de valeurs) de classe ArrayList.

    Fragment de l'array-source (de libellés) :
    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
     
        final static Object[] formTarif_Libellés =
        {   new Object[]
            {  new String( "NomDuFournisseur" ),
                new String( "blabla" ),
                new Boolean(Prix.indexés.enBooléen()),
                new String( "Ne" ),
                new String( "Nc" )
            },
            new Object[]    // En Français
            {  new String( "Région A" ),
                new String( "Région B" ),
                new String( "Région C" ),
                new Object[]
                {   new String( "Prix pour le produit même" ),
                    new Object[]
                    {   new String( "Formule tarifaire" ),
    ...
    Fragment de l'array-cible (de valeurs) :
    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
    20
    21
    22
     
        final static Object[] formTarif_ABC =
        {   new Object[]
            {  new String( "fghj" ),
                new String( "2009 Q3" ),
                FormTarif_Libellés.get_FormTarif_Libellés(),  // static
                new BigDecimal( 1.111 ),
                new BigDecimal( 2.222 )
            },
            new Object[]    // [0] : 2009 Q3
            {   new Object[] // Région A
                {   new Object[] // Prix du produit même
                    {   new String( "Contrat annuel" ),
                        new Boolean(Prix.indexés.enBooléen()),
                        new Object[]
                        {   new Object[]
                            {   new Object[]
                                {   new Object[]
                                    { new BigDecimal( 50.00 ),
                                      new BigDecimal( 90.90 )
                                    },
    ...
    Dans la fonction qui importe les libellés un à un et construit l'Array-Liste-cible, pour chaque libellé à importer,
    je n'ai pas pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String str = formTarif_Libellés[i])[j];
    "Incompatible types :
    found : java.lang.Object
    required : java.lang.String
    j'ai dû écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new String((String) ((Object[]) formTarif_Libellés[i])[j]);
    Un casting s'avère nécessaire à chaque niveau ( Object[] aussi) ! Et j'en ai beaucoup à plus de deux niveaux. Pourquoi ?
    Merci d'avance.

  2. #2
    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
    Citation Envoyé par Chavadam Voir le message
    j'ai dû écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new String((String) ((Object[]) formTarif_Libellés[i])[j]);
    Le new String(string) ne sert à rien, pour info.


    Un casting s'avère nécessaire à chaque niveau ( Object[] aussi) ! Et j'en ai beaucoup à plus de deux niveaux. Pourquoi ?
    Merci d'avance.
    Parce que tu n'a pas typé le contenu de ton tableau, tu t'es contenté de dire que c'était un tableau d'objet. Donc java te retourne un type "Object", sans plus. Si le premier niveau est toujours un tableau de tableaux, alors tu peux normalement réduire ton problème comme 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
     final static Object[][] formTarif_Libellés =
        {   new Object[]
            {  new String( "NomDuFournisseur" ),
                new String( "blabla" ),
                new Boolean(Prix.indexés.enBooléen()),
                new String( "Ne" ),
                new String( "Nc" )
            },
            new Object[]    // En Français
            {  new String( "Région A" ),
                new String( "Région B" ),
                new String( "Région C" ),
                new Object[]
                {   new String( "Prix pour le produit même" ),
                    new Object[]
                    {   new String( "Formule tarifaire" ),
    //..........
    String s = (String) formTarif_Libellés[i][j];


    PS: la structure que tu utilise est pour le moins ... curieuse!

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut Casting nécessaire à chaque niveau d'imbrication d'Object

    Le new String(string) ne sert à rien, pour info.
    Si je l'élimine dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new String((String)((Object[]) formTarif_Libellés[i])[j]);
    , l'IDE (NetBeans 6.0) souligne en rouge sans tarder le mot 'String' du 'new String' restant.
    Si j'élimine le casting (String) dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaîneCible.add((String)((Object[])formTarif_Libellés[0])[4]);
    pas de soulignage d'erreur.
    - - - - - - - - - -

    Parce que tu n'a pas typé le contenu de ton tableau, tu t'es contenté de dire que c'était un tableau d'objet. Donc java te retourne un type "Object", sans plus.
    Je déduis que comme le compilateur se rend compte de la présence d'un niveau supplémentaire derrière ce simple 'Object' retourné, il exige plutôt une syntaxe mentionnant une array d'Object --> casting (Object[]).
    - - - - - - - - - -

    Si le premier niveau est toujours un tableau de tableaux, alors tu peux normalement réduire ton problème comme ceci:
    et
    La structure que tu utilises est pour le moins ... curieuse!
    L'analyse de la structure des données alimentant mon application ne conduit pas vers une structure arborescente dont toutes les branches n'ont des données (BigDecimal, Boolean, String) qu'à un même niveau (7e) de sous-branchage. Si cela avait été le cas, j'aurais pu créer un Object[][][][][][][]. Comme ces données se situent logiquement à différents niveaux (1 à 7), je suis en présence d'un arbre dont les sous-branches s'arrêtent aléatoirement. Je ne vois que la possibilité de placer un 'new Object' dans une sous-branche dès qu'est détecté le besoin d'une sous-branche de données ultérieure. A son tour, ... idem.
    Il en serait de même avec une ArrayList, ...
    Quelle autre syntaxe d'arborescence rendrait ma structure de données moins curieuse ?
    - - - - - - - - - -
    Hélas, p. ex. pour le 4e niveau, j'ai une syntaxe pareille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaîneCible.add(((Object[])((Object[])((Object[])((Object[])formTarif_Libellés[langue])[3])[1])[1])[4]);
    Le but de ma question originale était : Comment pouvoir écrire ces statements sans tous ces castings ...
    - - - - - - - - - -
    Merci d'avance.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Ta structure de données est vraiment bizarre, des tableau de tableau de tableau!!
    Si tu veux un arbre utilise un TreeMap. ou construit le tien si il est très spécifique.

  5. #5
    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
    Citation Envoyé par Chavadam Voir le message


    Si je l'élimine dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new String((String)((Object[]) formTarif_Libellés[i])[j]);
    , l'IDE (NetBeans 6.0) souligne en rouge sans tarder le mot 'String' du 'new String' restant.
    J'ai bien dit que c'était le new String qui était inutile. Ce code suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (String)((Object[]) formTarif_Libellés[i])[j]
    En fait on ne fait que extrèmement rarement appel à new String en java.

    Je déduis que comme le compilateur se rend compte de la présence d'un niveau supplémentaire derrière ce simple 'Object' retourné, il exige plutôt une syntaxe mentionnant une array d'Object --> casting (Object[]).
    Non c'est l'inverse. Le compilateur ignore ce que tu a mis spécifiquement dans ton Object[], c'est justement pour ça que t'as besoin d'un type casting explicite pour revenir à un tableau depuis un Object et pouvoir enfin l'indexer.
    L'analyse de la structure des données alimentant mon application ne conduit pas vers une structure arborescente dont toutes les branches n'ont des données (BigDecimal, Boolean, String) qu'à un même niveau (7e) de sous-branchage. Si cela avait été le cas, j'aurais pu créer un Object[][][][][][][]
    Ca ne justifie pas cette horreur

    Crée un type de donnée spécifique à ton application, ce sera plus propre. Tu pourrais par exemple créer ce genre d'objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Node {
       Node[] childs;
       Object value;
       public Node(Object value){this.value=value;}
       public Node(Node[] childs) {this.childs=childs;}
       public Object getValue(){
           return value;
       }
       public Node getChild(int index){
           return childs[index];
       }
    }
    Ensuite tu l'utiliserais comme çà, par exemple:

    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
    20
    21
    22
    23
    24
    formTarif_Libellés = new Node(  // root
        new Node[] {   // root content
            new Node(   // element 1
              new Node[] {  
                new Node( "NomDuFournisseur" ),  //element 1.1
                new Node( "blabla" ),                  //element 1.2
                new Node(Prix.indexés.enBooléen()), //element 1.3
                new Node( "Ne" ),                          //element 1.4
                new Node( "Nc" )                          //element 1.5
              }
            ),
            new Node (  //element 2
              new Node[] {
                new Node("Région A"),   // element 2.1
                new Node(new Node[]{ // element  2.2
                  new Node("Prix pour le produit même" ),  // element 2.2.1
                  new Node(new Node[] {  //element 2.2.2
                    new Node( "Formule tarifaire" )  // element 2.2.2.1
    // etc
     
    // accès à l'élément 2.2.1:
     String s = (String)formTarif_Libellés.getChild(2).getChild(2).getChild(1).getValue();
    // accès au boolean 1.3:
    Boolean b =  formTarif_Libellés.getChild(2).getChild(3).getValue();

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut Casting nécessaire à chaque niveau d'imbrication d'Object
    Déclics faits.
    Merci bcp, tchize et hibour.

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

Discussions similaires

  1. Augmenter le niveau d'imbrication de Itemize
    Par Jiboulingo dans le forum Mise en forme
    Réponses: 3
    Dernier message: 25/12/2011, 07h26
  2. [CMMi] les caractéristiques chaque niveau CMMI
    Par geforce dans le forum Qualité
    Réponses: 0
    Dernier message: 14/02/2010, 21h32
  3. Réponses: 1
    Dernier message: 22/12/2009, 19h22
  4. Trigger et le niveau d'imbrication
    Par yan77 dans le forum Développement
    Réponses: 1
    Dernier message: 02/03/2009, 16h39
  5. Réponses: 6
    Dernier message: 16/04/2007, 15h33

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