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

avec Java Discussion :

Utilisation d'une Hashmap pour remplacer une série de tests


Sujet :

avec Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 9
    Par défaut Utilisation d'une Hashmap pour remplacer une série de tests
    Bonjour à tous,

    Je pense pouvoir utiliser une HashMap<Integer, Integer> pour remplacer une série de test dans une méthode.

    Cette méthode permet de valoriser des attributs en fonction de leur position dans une HashMap<Integer, Bigdecimal>

    avec un if(i == 0) => valorisation de l'attribut 1
    if(i == 1) => valorisation de l'attribut 2

    et ainsi de suite.

    Comment dois-je procéder ?

    Par avance merci de vos réponses et bonne fin de journée.

  2. #2
    Membre éprouvé Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Bonjour Veve25,
    Pourrais-tu donner un peu plus de détails sur l’algorithme que tu souhaites mettre en place.
    Pour moi, clairement ici, tu souhaites réécrire une sorte de switch()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     switch (indice) {
                case 1:  monTest1();
                         break;
                case 2:  monTest2();
                         break;
                case 3:  monTest3();
                         break;
    Est-ce ça que tu souhaites faire?
    Dans ce cas là, tu as aussi la possibilité de créer une méthode testResult sur ton objet à tester et de renvoyer toujours la bonne valeur dépendante de l'indice fourni en paramètre.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 9
    Par défaut
    Bonjour bygui,

    Et merci pour l'intérêt porté à ma question.

    En fait pour valoriser mes attributs j'ai écrit cette méthode :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    public void valoriserCellulesEdition0304(HashMap<CleHNumEtat0304, Integer> lahashlisteTotMvtStockET0304, CleHNumEtat0304 cleHash,
            Integer valeurCellule, int i)
        {
     
            valeurCellule = lahashlisteTotMvtStockET0304.get(cleHash);
     
            if (valeurCellule != null && i == 0)
            {
                // valorisation ColonneQuot1
                this.setColonneQuot1(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 1)
            {
                // valorisation ColonneQuot2
                this.setColonneQuot2(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 2)
            {
                // valorisation ColonneQuot3
                this.setColonneQuot3(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 3)
            {
                // valorisation ColonneQuot4
                this.setColonneQuot4(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 4)
            {
                // valorisation ColonneQuot5
                this.setColonneQuot5(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 5)
            {
                // valorisation ColonneQuot6
                this.setColonneQuot6(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 6)
            {
                // valorisation ColonneQuot7
                this.setColonneQuot7(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 7)
            {
                // valorisation ColonneQuot8
                this.setColonneQuot8(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 8)
            {
                // valorisation ColonneQuot9
                this.setColonneQuot9(valeurCellule);
     
            }
     
            if (valeurCellule != null && i == 9)
            {
                // valorisation ColonneQuot10
                this.setColonneQuot10(valeurCellule);
     
            }
     
        }
    qui est appelée par ma classe d'implémentation dans cette méthode :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    public Collection creerDatasource(Map parametresEdition)
        {
            /** on récupère les paramètres de l'édition */
            Etat0304Edition edition = (Etat0304Edition) parametresEdition.get("edition");
     
            /** on récupère les critères */
            Etat0304Critere lescriteres = (Etat0304Critere) edition.getLeCritere();
     
            /**
             * on récupère la hashmap des valeurs trouvées en base et les critères de l'édition soit la gestion, la date
             * etat de solde et le type de valeur
             */
            HashMap<CleHNumEtat0304, Integer> lahashlisteTotMvtStockET0304 =
                this.totmvtstockintereditionserviceso.rechercherTotMvtsStockInterET0304(lescriteres.getLaGestion(),
                    lescriteres.getDateEtatSolde(),
                    lescriteres.getTaOuTf());
     
            /** on récupère les critères de choix de l'utilisateur */
            TypeValeur choixCriteresUtilisateur = lescriteres.getTaOuTf();
            QuotiteValeur pCriteresRecherche = new QuotiteValeur();
            pCriteresRecherche.setLeTypeValeur(choixCriteresUtilisateur);
     
            /**
             * En fonction du choix de l utilisateur on récupère la liste des quotités à l'aide de la méthode de recherche
             * en base en passant par le service quotitevaleurserviceso
             */
            HashMap<Integer, BigDecimal> laListeQuotiteValeur = completerLeTableauQuotitesValeurs(pCriteresRecherche);
     
            /** Création d une liste de Bean */
            List<Etat0304EditionBean> listeEtat0304EditionBean = new ArrayList<Etat0304EditionBean>();
     
            /** Création d un Bean a mettre dans ma liste */
            Etat0304EditionBean leEtat0304EditionBean = new Etat0304EditionBean();
            /** Valorisation de la ligne des quotités de l'édition dans le Bean */
            leEtat0304EditionBean.valoriserLaLigneQuotite(laListeQuotiteValeur);
     
            /*** Rechercher dans la HashMap le couple codique et quotite */
            Integer valeurCellule;
            CleHNumEtat0304 cleHash;
     
            /*** Rechercher la liste de tous les intermédiaires */
            List<Intermediaire> listeInter =
                this.referenceserviceso.rechercherListeTousLesIntermediairesPourUnPosteCentral(lescriteres.getLePosteCentralisateur());
     
            List<Etat0304EditionBeanLigne> listeEtat0304EditionBeanLigne = new ArrayList<Etat0304EditionBeanLigne>();
            Etat0304EditionBeanLigne leEtat0304EditionBeanLigne;
     
            /***
             * Déclaration booléen existeDansTotMvtStockET0304 afin de vérifier la condition de présence dans la HashMap
             */
            Boolean existeDansTotMvtStockET0304;
     
            for (Intermediaire itInter : listeInter)
            {
     
                existeDansTotMvtStockET0304 = false;
     
                leEtat0304EditionBeanLigne = new Etat0304EditionBeanLigne();
     
                leEtat0304EditionBeanLigne.setLibelle(itInter.getNomInter());
     
                leEtat0304EditionBeanLigne.setListeQuotiteValeur(laListeQuotiteValeur);
     
                for (int i = 0; i < laListeQuotiteValeur.size(); i++)
                {
     
                    cleHash = new CleHNumEtat0304(itInter.getCodique(), laListeQuotiteValeur.get(Integer.valueOf(i)));
                    valeurCellule = lahashlisteTotMvtStockET0304.get(cleHash);
                    leEtat0304EditionBeanLigne.valoriserCellulesEdition0304(lahashlisteTotMvtStockET0304, cleHash, valeurCellule, i);
     
                    //System.out.println(laListeQuotiteValeur.get(Integer.valueOf(i)) + " " + valeurCellule + " " + i);
     
                    /***
                     * Test du booléen existeDansTotMvtStockET0304
                     */
                    if (valeurCellule != null)
                    {
                        existeDansTotMvtStockET0304 = true;
                    }
     
                }
     
                if ("Oui".equals(itInter.getActifOuiNon()) || "Non".equals(itInter.getActifOuiNon())
                    && existeDansTotMvtStockET0304.equals(true))
                {
     
                    leEtat0304EditionBeanLigne.calculValeurCellule();
                    listeEtat0304EditionBeanLigne.add(leEtat0304EditionBeanLigne);
                }
     
            }
     
            leEtat0304EditionBean.setLesEtats0304EditionBeanLigne(listeEtat0304EditionBeanLigne);
            listeEtat0304EditionBean.add(leEtat0304EditionBean);
            edition.setLesEtats0304EditionBean(listeEtat0304EditionBean);
     
            List<Etat0304Edition> listePourJasper = new ArrayList<Etat0304Edition>();
            listePourJasper.add(edition);
            return listePourJasper;
        }

    Remplacer cette série de tests par un switch() serait effectivement plus élégant. Cependant de cette manière j'ai toujours une série de tests en fonction des "case".
    Je pensais pouvoir remplacer cette série de tests en déclarant une Hashmap qui ferait le lien entre la position dans la "liste" et l'attribut à valoriser en fonction donc de la boucle for ou j'appelle ma seconde méthode à ce niveau du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i = 0; i < laListeQuotiteValeur.size(); i++)
                {
     
                    cleHash = new CleHNumEtat0304(itInter.getCodique(), laListeQuotiteValeur.get(Integer.valueOf(i)));
                    valeurCellule = lahashlisteTotMvtStockET0304.get(cleHash);
                    leEtat0304EditionBeanLigne.valoriserCellulesEdition0304(lahashlisteTotMvtStockET0304, cleHash, valeurCellule, i);

  4. #4
    Membre éprouvé Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Je vois une petite coquille. Dans ta méthode creerDatasource tu envoies la valeur "valeurCellule":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                for (int i = 0; i < laListeQuotiteValeur.size(); i++)
                {
     
                    cleHash = new CleHNumEtat0304(itInter.getCodique(), laListeQuotiteValeur.get(Integer.valueOf(i)));
                    valeurCellule = lahashlisteTotMvtStockET0304.get(cleHash);
                    leEtat0304EditionBeanLigne.valoriserCellulesEdition0304(lahashlisteTotMvtStockET0304, cleHash, valeurCellule, i);
    Mais tu la redéfinis dans la méthode valoriserCellulesEdition0304. De plus tu as beaucoup trop de paramètres si je me base sur ce que tu montres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeurCellule = lahashlisteTotMvtStockET0304.get(cleHash);
    Pour ce que tu demandes, il faut que tu regardes de coté de la réflexion
    Cela donnerait une méthode du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Method method = myclass.getMethod("setColonneQuot"+i, Integer);
    Object returnValue = method.invoke(myclass, valeurCelluleInteger);

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Euh, le plus simple serait de remplacer les champs colonneQuot* par une Map ou une List qui contient tous les colonneQuot.
    Pas besoin d'introspection.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 9
    Par défaut
    Bonjour à tous les deux,

    Pour le moment j'ai remplacé ma série de if par

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    if (valeurCellule != null)
            {
                switch (i)
                {
                    case 0:
                        this.setColonneQuot1(valeurCellule);
                        break;
                    case 1:
                        this.setColonneQuot2(valeurCellule);
                        break;
                    case 2:
                        this.setColonneQuot3(valeurCellule);
                        break;
                    case 3:
                        this.setColonneQuot4(valeurCellule);
                        break;
                    case 4:
                        this.setColonneQuot5(valeurCellule);
                        break;
                    case 5:
                        this.setColonneQuot6(valeurCellule);
                        break;
                    case 6:
                        this.setColonneQuot7(valeurCellule);
                        break;
                    case 7:
                        this.setColonneQuot8(valeurCellule);
                        break;
                    case 8:
                        this.setColonneQuot9(valeurCellule);
                        break;
     
                    default:
                        this.setColonneQuot10(valeurCellule);
     
                }
            }
    et enlevé les paramètres inutiles. Merci pour ces remarques judicieuses tout compil et le code est moins lourd.

    Concernant la remarque de thelvin : que veux-tu dire par "remplacer les champs colonneQuot* par une Map ou une List qui contient tous les colonneQuot"
    Un petit exemple STP. de mon côté je vais lire la doc sur les collections car je ne maitrise pas tout.

    Merci à vous.

  7. #7
    Membre éprouvé Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Ce qu'il te propose c'est de modifier ton objet contenant les attributs int colonneQuot<number> par une liste ou un vecteur.
    Et donc de remplacer toute tes methodes
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    addColonneQuot(int number) {
    maList.add(number);
    }
    Ensuite tu n'aurais qu'a parcourir cette liste une seule fois pour savoir sur lesquelles tu appliques ton changement.

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2017
    Messages : 9
    Par défaut
    OK. Merci pour votre aide.

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

Discussions similaires

  1. Lien dans un frame d'une cadre pour ouvrir une autre page sur une même fenêtre
    Par maelislah dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 27/06/2015, 20h39
  2. Réponses: 0
    Dernier message: 25/10/2014, 10h48
  3. Comment faire pour remplacer une donnée Null par une autre.
    Par Dpedrosa dans le forum Général VBA
    Réponses: 1
    Dernier message: 09/03/2008, 11h25
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. Réponses: 5
    Dernier message: 26/05/2005, 15h40

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