Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Java] Les tableaux associatifs

Comment se servir de Map

Sujet résolu
    23 mars 2007 à 17:59:06

    Bonjour à tous,

    Entrée en matière


    Pour les besoins de mon TPE (qui approche à grand pas), je me suis chargé de programmer une petite application pour notre production finale. Malheureusement, la documentation du constructeur est très pauvre pour à peu près tous les langages, et le seul langage pour lequel il y avait un exemple d'application, c'était Java. Pour faire simple, je dirais que mon TPE porte sur les puces RFID et qu'on a donc acheté un petit lecteur de puces RFID. L'application que je veux faire est donc quelque chose qui détecte si un tag est passé à proximité du lecteur et affiché un objet correspondant pour faire comme lors d'un passage en caisse, mais en remplaçant la phase de lecture par code-barre par un passage des tags devant le lecteur. J'ai donc décidé de me lancer dans le Java par nécessité et me farcit donc depuis 2 week-end des tutos à gogos et pourtant je n'ai pas encore trouvé comment faire une chose.

    Le problème


    J'ai cherché comment faire pour mettre en place un tableau associatif qui associerait le numéro des tags (les puces RFID de notre lecteur ne contienne qu'un identifiant) à un objet pour pouvoir changer facilement ces objets en fonction de ce que veulent mes camarades et par soucis d'optimisation. J'ai trouvé un lien du cours de Developpez.com (Penser en Java) là-dessus, rien à dire, c'est complet, mais beaucoup trop complet et compliqué pour moi, 2 week-end de programmation ça fait peu ^^ . J'ai malgré tout réussi à créer ce tableau, mais je ne sais pas comment m'en servir, ni comment le récupérer d'ailleurs.

    Le code


    Voilà mon code (de débutant, ne l'oubliez pas) :
    package sans_titre4;
    import Phidgets.*;
    import biputil2.*;
    import java.lang.String;
    import java.awt.*;
    import java.util.*;
    import java.awt.event.* ;

    class Sans_titre1 extends  _IPhidgetRFIDEventsAdapter{

        static Map fill(Map p)
        {
            p.put("01023c60f5", "courgette");
            p.put("01023c72b5", "endive");
            p.put("01023c3f96", "tomate") ;
            p.put("01023c58d1", "T-shirt M");
            p.put("01023c45d7", "Livre");
            p.put("01023c5962", "Machine à Laver") ;
            return p ;
        }

        // Cette classe définit les actions à exécuter lors du passage d'un Tag
        public void OnTag(_IPhidgetRFIDEvents_OnTagEvent ev)
        {
            // On enregistre dans une variable l'id du Tag qui vient d'être passé
            String tag = new String(ev.get_TagNumber());
            // On créé un nouvel "objet" qui représente le fichier dans lequel est enregistrée la commande
            SequentialFile fichier = new SequentialFile();         
            // On créé un booléen qui vaudra true si le fichier est bien ouvert
            boolean ouverture = fichier.open("produit.txt", 'r');
            if (ouverture) // Si l'ouverture s'est bien passée
            {
                boolean presenceproduit = false; // On créé un booléen pour savoir si le produit est déjà dans le fichier
                String contenu = new String() ; // On créé la variable contenant le contenu du fichier avant de le parcourir
                while (!fichier.EndOfFile) // Tant qu'on n'est pas arrivé à la fin du fichier
                {
                    String courant = new String(fichier.fieldOf(fichier.read(), 1)); // On récupère la ligne courante
                    if(!courant.equals("null")) // Si la ligne contient quelque chose
                        contenu=contenu.concat("\n\r"+courant); // On ajoute la ligne au contenu du fichier
                    if (tag.equals(courant)) // Si on trouve l'id du tag dans le fichier, on l'indique dans presenceproduit
                        presenceproduit = true;
                }

                if (!presenceproduit) // Si l'id du tag n'est pas déjà dans le fichier
                {
                    System.out.println("Produit détecté: " + tag); // On affiche l'id du tag
                   
                    // Partie que je voudrais remplacer avec un tableau associatif, sinon un switch peut être préférable
                    if(tag.equals("01023c60f5"))
                       System.out.println("Type de produit: courgette");       
                    else if (tag.equals("01023c72b5"))
                        System.out.println("Type de produit: endive");
                    else if(tag.equals("01023c3f96"))
                        System.out.println("Type de produit: tomate");
                    else if(tag.equals("01023c58d1"))
                        System.out.println("Type de produit: T-shirt M");
                    else if(tag.equals("01023c5962"))
                        System.out.println("Type de produit: Machine à laver") ;
                    else if(tag.equals("01023c45d7"))
                        System.out.println("Type de produit: Livre");
                   
                    fichier.close();
                    fichier.open("produit.txt", 'w');
                    fichier.write(contenu.concat("\n\r"+tag));
                }
            }
            else
                System.out.println("Problème lors de l'ouverture du fichier");
            fichier.close();
        }
        public void OnDetach(_IPhidgetRFIDEvents_OnDetachEvent ke)
        {
                    System.out.println("FINISHED!");
        }

        public static void main(String[] args)
        {
                   new Sans_titre1() ;
        }
        public Sans_titre1()
           {
             PhidgetRFID phidgetrfid = new PhidgetRFID();
             phidgetrfid.add_IPhidgetRFIDEventsListener(this);
             phidgetrfid.Open(true) ;
             if(phidgetrfid.GetIsAttached())
             {
                System.out.println("Le lecteur est connecté.");
             }
            else
            {
                System.out.println("Le lecteur n'est pas connecté.");
                new Sans_titre1() ;
            }
            phidgetrfid.SetOutputState(3, true);
            phidgetrfid.SetOutputState(1, true);
            phidgetrfid.run();
        }
    }

    D'avance merci !

    • Partager sur Facebook
    • Partager sur Twitter
      24 mars 2007 à 11:13:29

      Bonjour,
      recherches ur hashmap !
      c'est une map avec une vraie clé primaire si tu veux :
      sa ressemble à sa :
      ______ ______ __________
      |clé 1 | --> |objet1|-->|objet 1bis|
      |clé 2 | --> |objet2|
      |clé 3 | --> |objet3|-->|objet 3bis|

      ducoup je pense que si pour les clé tu utilise le num tags detes puces, l'approche serait plus évidente !
      regarde la javadoc de hashmap et reposte si ta des pb !

      ameliep
      • Partager sur Facebook
      • Partager sur Twitter
        24 mars 2007 à 21:57:40

        class Sans_titre1 extends  _IPhidgetRFIDEventsAdapter{

            // Cette classe définit les actions à exécuter lors du passage d'un Tag
            public void OnTag(_IPhidgetRFIDEvents_OnTagEvent ev)
            {
                Map produits=new HashMap() ;
                produits.put("01023c60f5", "Courgette");
                produits.put("01023c72b5", "Endive");
                produits.put("01023c3f96", "Tomate") ;
                produits.put("01023c58d1", "T-shirt M");
                produits.put("01023c45d7", "Livre");
                produits.put("01023c5962", "Machine à Laver") ;

                Map prix=new HashMap();
                prix.put("01023c60f5", "1.50");
                prix.put("01023c72b5", "1");
                prix.put("01023c3f96", "2") ;
                prix.put("01023c58d1", "20");
                prix.put("01023c45d7", "9");
                prix.put("01023c5962", "250") ;
                /* plein de code */


                    if (!presenceproduit) // Si l'id du tag n'est pas déjà dans le fichier
                    {
                        System.out.println("Produit détecté: " + produits.get(tag) + "\n\rPrix : " + prix.get(tag) + " €"); // On affiche l'id du tag
        Voilà ce que j'ai réussi à faire en re googlant un peu, et apparemment ça rejoint le lien que tu m'as donné. Y a t'il donc quelque chose que je pourrais améliorer à ton avis ?
        Merci
        • Partager sur Facebook
        • Partager sur Twitter
          25 mars 2007 à 12:19:34

          bonjour,
          petit pb :
          tes déclarations st pas vraiment bonnes : je veux dire elles sont correctes mais ne remplissent pas vraiment l'idée :
          Map produits=new HashMap() ;

          tu dois écrire :
          HashMap produits=new HashMap() ;


          Autre point :
          (la fo me dire si je me trompe ; c'est vis-à vis de l'utilisation de ton hashmap !)
          on a une clé primaire : exemple la clé : "01023c60f5" qui va se retrouver à la fois dans produits et dans prix --> donc allocation de mémoire double -->donc non optimisation -->donc c'est pas bien !!!
          tu conviendras que c'est débile, si à chaque fois tu utilises la meme clé !

          je te propose donc un truc comme ça :
          "clé --> produit -->prix" -->gain de place !!
          et la on a une vraie hashmap et non plus de simples couples : c'est maintenant que c'est interessant!
          quand tu vas programmer, tu pourras associer à la fois un produit et/ou un prix à ton hashmap. de meme, tu pourras récupérer les infos!
          Le soucis est désormais de bien classer tes infos pour récupérer les bonnes au bon moment!

          à mon avis, le plus simple est d'utiliser un tableau de deux String et tu te bases toujours sur le fait que la "premiere case" du tableau est ton produit et la "seconde" le prix associé. tu pourras ainsi récup et donner les infos simplement ! Ce tableau correspond à la partie droite du hashmap : les valeurs!
          La partie gauche contient la clé !
          schéma :
          partie gauche || partie droite
          clé : "01023c60f5" --> associée au tableau : |produit : "courgette"|prix : "1.50"|
          clé 2 ..... etc..

          tu comprends ??
          j'espere que mon analyse est compréhensible, c'est à mon avis la meilleure à utiliser pour ton probleme : en aucun cas utiliser deux hashmap sur une meme clé --> aucun sens : c'est pas le but d'une map !
          Il faut que tu gardes à l'esprit qu'une map,hashmap,etc... n'est qu'une association clé-valeurs et dans valeurs tu mets ce que tu veux !!!!



          • Partager sur Facebook
          • Partager sur Twitter
            25 mars 2007 à 14:54:28

            Ok pour la déclaration

            Pour ce qui suis, tu as tout à fait raison, je me demandais justement comment faire pour des tableaux multi-dimensionnels comme en PHP, je te remercie donc de ta réponse. Moi j'aurais voulu faire comme ça (si tu connais le PHP) :
            $produits=array('tag' => array('produit' => 'courgette', 'prix' => '1.50'), 'tag2' => array('produit' => 'Tomate', 'prix' => '1')) ;
            echo $produits['tag']['produit']; // Courgette
            echo $produits['tag2']['prix']; // 1

            Par contre je viens d'essayer et je vois pas trop comment utiliser le HashMap pour mettre deux valeurs à une même clé, en mettant une virgule et le prix après il me souligne mon put, et en mettant un autre put il me remplace l'autre valeur. Donc j'aurais besoin une dernière fois de ton aide ^^ .
            • Partager sur Facebook
            • Partager sur Twitter
              25 mars 2007 à 19:52:37

              Voila ce qu'il te propose de faire :


              public static void main(String[] args) {
                              // 2d Array ( Product , Price )
                              String[][] sArray2dProduitPrix = new String[100][2];
                              // HashMap Id -> (Product,Price)
                              HashMap<String,String[]> hmTest= new HashMap<String,String[]>();
                              sArray2dProduitPrix[0][0] = "Courgettes";
                              sArray2dProduitPrix[0][1] = "1.50";
                              hmTest.put("01023c60f5", sArray2dProduitPrix[0]);
                             
                              // Iteration
                              Iterator<String> it = hmTest.keySet().iterator();
                              while(it.hasNext()){
                                      String sKey = it.next();
                                      String sProduct = hmTest.get(sKey)[0];
                                      String sPrice = hmTest.get(sKey)[1];
                                      System.out.println("ID : "+sKey+", Produit : "+sProduct+", Prix : "+sPrice);
                              }
                      }



              Edit :

              tu peux aussi bien passer par une arraylist de String[2] si tu veux garder tes donnés. Mais si tu ne veux pas cette methode sera surement plus efficace :

              public static void main(String[] args) {
                              HashMap<String,String[]> hmTest= new HashMap<String,String[]>();
                      hmTest.put("0001", new String[]{"Concombre", "1.787"});
                      hmTest.put("00789307", new String[]{"Courgettes", "1.765783"});
                      hmTest.put("0003", new String[]{"Tomates", "7687937"});
                      hmTest.put("0004", new String[]{"Lardons", "63.4"});
                      hmTest.put("0045", new String[]{"Oeufs", "378.8"});
                      hmTest.put("004", new String[]{"Laitue", "4232"});
                      hmTest.put("01", new String[]{"Mayonnaise", "1.3"});
                      // Iteration
                      Iterator<String> it = hmTest.keySet().iterator();
                      while(it.hasNext()){
                              String sKey = it.next();
                              String sProduct = hmTest.get(sKey)[0];
                              String sPrice = hmTest.get(sKey)[1];
                              System.out.println("ID : "+sKey+", Produit : "+sProduct+", Prix : "+sPrice);
                      }
                      System.out.println("Done");
                      }
              • Partager sur Facebook
              • Partager sur Twitter
                25 mars 2007 à 20:39:44

                dsl pas un pro du php, quelques notions mais c'est tout !
                cf sateth pour le code !!
                merci sateth c'est ce que je voulais dire dans l'idée, je ne l'aurai aps implementé de la mm façon mais c'est un truc dans le genre qu'il faut faire à mon avis !
                -->pour pas t'emmerder, tu peux utiliser les structures déja faites type arraylist ou vector!
                Cependant, je voies pas
                String[][] sArray2dProduitPrix = new String[100][2];

                pourquoi 2 ?
                merci !
                bonne continuation !
                ameliep
                • Partager sur Facebook
                • Partager sur Twitter
                  25 mars 2007 à 20:41:46

                  en fait la restriction à 100 id ne me plait pas beaucoup, comme dit dans l'edit le mieux serait une Arraylist. Et le 2 est ici parce que l'on a un couple (Produit,Prix)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 mars 2007 à 20:45:54

                    Je ferais tout ça si j'ai le temps, mais là je suis en plein dans les derniers préparatifs du TPE, donc faudra voir ^^ . En tout cas je vous remercie déjà pour ce que vous avez fait, j'approfondirais un peu le Java après passé le week end prochain et sûrement pendant les vacances.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 mars 2007 à 22:08:36

                      Pour ta partie :

                      System.out.println("Le lecteur n'est pas connecté.");
                      new Sans_titre1() ;

                      ca me semble un peu lourd non ? tu vas scanner a l'infini si le lecteur est connecté ou pas ? je te proposerai plutot de creer une JDialog qui dirait de connecter le lecteur puis de cliquer sur Ok, lors du clik sur OK tu refais le scan. Si c'est bon alors passe a la suite, sinon ne fais rien : reste sur le JDialog, de cette facon les scans seront moins frequent mais tout aussi efficaces.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 mars 2007 à 7:46:12

                        merci stateh pr les explications!
                        bonne continuation à vous !
                        ciao
                        ameliep
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Java] Les tableaux associatifs

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown