Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer un intervalle de valeur dans arraylist

Sujet résolu
    19 janvier 2018 à 8:29:02

    Bonjour,

    je suis entrain de faire un petit programme qui permet de faire une sort de gestion d'article en java.

    Mais voila, je bloc au stade ou je dois rechercher un intervalle de "prix" depuis mon arraylist.

    Voici le bout de code que j'ai deja : 

    /**
    *   @author TTGamer
    */
    
    public class Program 
    {
        static Scanner scanne = new Scanner(System.in);
        public static ArrayList<Article> articles = new ArrayList();
    
        public static void main(String[] args) 
        {
            do{
                //searchByIntervalle
                System.out.println("\n----------------------------------------\n"
                            + "Bienvenue dans l'intervalle de prix\n"
                            + "----------------------------------------\n");
                System.out.print("Veuillez saisir un prix minimum\n> ");
                int prixMin = scanne.nextInt();
                System.out.println("Veuillez saisir un prix maximum\n> ");
                int prixMax = scanne.nextInt();
                Program.searchByIntervalle(prixMin, prixMax);
    
                // Demmamde a l'utilisateur si il veut continuer
                System.out.print("\nVoulez-vous continuer le programme ?(oui/non)\n> ");
                repBoucle = scanne.next();
                if (repBoucle.equals("oui")) 
                {
                    boucle = true;
                }
                System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
            } while (boucle == true)
        }
    
    
        // Methode in build
        protected static void searchByIntervalle(int prixMin, int prixMax) {
            articles.forEach((article) -> {
                if (prixMin >= 0 && prixMax <= 6000) {
                    System.out.println("\nArticle correspondant à votre recherche :");
                    System.out.println(" - Id : " + article.getId());
                    System.out.println(" - Nom : " + article.getName());
                    System.out.println(" - Prix : " + article.getPrix());
                    System.out.println(" - Stock : " + article.getStock());
                } else {
                    System.err.println("----------------------------------------\n"
                                    + "Aucun article trouvé !\n"
                                    + "----------------------------------------");
                }
            });
        }
    }
    
    
    // class article
    /**
     *
     * @author TTGamer
     */
    public class Article {
    
        private int id;
        private String name;
        private int prix;
        private int stock;
    
        public Article(int id, String name, int prix, int stock) {
            this.id = id;
            this.name = name;
            this.prix = prix;
            this.stock = stock;
        }
    
        protected int getId() {
            return this.id;
        }
    
        protected void setId(int id) {
            this.id = id;
        }
    
        protected String getName() {
            return this.name;
        }
    
        protected void setName(String name) {
            this.name = name;
        }
    
        protected int getPrix() {
            return this.prix;
        }
    
        protected void setPrix(int prix) {
            this.prix = prix;
        }
    
        protected int getStock() {
            return this.stock;
        }
    
        protected void setStock(int stock) {
            this.stock = stock;
        }
    
    }
    

    Voila, j'éspere que quelqun va pouvoir m'éclairé. :D

    TTGamer.

    • Partager sur Facebook
    • Partager sur Twitter

    I'AM NOT A GEEK ❌ ! I'AM A GAMER 🎃🔥 !

      19 janvier 2018 à 11:10:07

      Bonjour,

      Le problème vient du fait que tu mélanges collecte des résultats et affichage.

      Ma suggestion est de faire deux méthodes : une qui retourne une liste des articles dans l'intervalle de prix et une qui affiche le résultat de la recherche.

      // Retourne une liste avec les articles dans l'intervalle de prix.
      List<Article> searchByIntervalle(int prixMin, int prixMax)
      
      // Affiche une liste d'articles.
      void afficherResultat(List<Article> articles)

      Tu pourras éventuellement réutiliser cette deuxième méthode pour afficher les résultats de recherche avec d'autres critères.

      -
      Edité par brubru777 19 janvier 2018 à 11:10:49

      • Partager sur Facebook
      • Partager sur Twitter
        19 janvier 2018 à 11:14:47

        A quel moment est-ce que tu remplis ta liste d'articles ?

        Mis à part ça, dans ton foreach, la phrase "Acucun article trouvé" s'affichera pour chaque article n'étant pas dans l'intervalle voulu. Pour y remédier :

        protected static void searchByIntervalle(int prixMin, int prixMax) {
            int counter = 0;
            articles.forEach((article) -> {
                if (prixMin >= 0 && prixMax <= 6000) {
                    counter++;
                    System.out.println("\nArticle correspondant à votre recherche :");
                    System.out.println(" - Id : " + article.getId());
                    System.out.println(" - Nom : " + article.getName());
                    System.out.println(" - Prix : " + article.getPrix());
                    System.out.println(" - Stock : " + article.getStock());
                }
            });
            if(counter == 0) {
                System.err.println("----------------------------------------\nAucun article trouvé !\n----------------------------------------");
            }
        }
        



        • Partager sur Facebook
        • Partager sur Twitter
        Hugo
          19 janvier 2018 à 11:55:42

          Bonjour,

          Merci de m'avoir donné quelque idées.

          brubru777 :

          oui ça semble possible mais j'ai préféré faire ma méthode comme ça :

           protected static void searchByIntervalle(int prixMin, int prixMax) 
               {
                  articles.forEach((article) -> 
                  {
                      if (prixMin <= article.getPrix() && prixMax >= article.getPrix()) 
                      {
                          System.out.println(
                                  "\nArticle correspondant à votre recherche :"
                                  + "\n - Id : " + article.getId()
                                  + "\n - Num de référance : " + article.getRef()
                                  + "\n - Nom : " + article.getName()
                                  + "\n - Prix : " + article.getPrix()
                                  + "\n - Stock : " + article.getStock()
                                  + "\n");
                      }
                  });

          Est ce que tu valide ma solution ? Contient elle des bugs ? Peut elle être améliorée ?

          HugoL.3 :

          Enfaite je fais un gros programme et la je suis dans un switch voila pourquoi tu vois pas ou j'insert des valeurs.

          /¬_¬\

          Et si vous savez comment je pourrais protéger mes scanner des entrés qui ne sont pas du bon Type.

          Exemple :

          System.out.print("Veuillez saisir un nombre\n> ");
          
          // l'utilisateur entre "Bonjour"
          // alors java va crash "java.util.InputMismatchException"
          
          int nbr = scanne.nextInt();
          
          System.out.print(nbr);

          Vous avez une idée pour contrer l'erreur ?

          Merci :)

          PS : je sais que sa part du sujet mais je demande au cas où

          -
          Edité par _.Linxy._ 19 janvier 2018 à 12:06:08

          • Partager sur Facebook
          • Partager sur Twitter

          I'AM NOT A GEEK ❌ ! I'AM A GAMER 🎃🔥 !

            19 janvier 2018 à 13:30:42

            System.out.print("Veuillez saisir un nombre\n> ");
            
            // l'utilisateur entre "Bonjour"
            // alors java va crash "java.util.InputMismatchException"
            
            int nbr = scanne.nextInt();
            
            System.out.print(nbr);

            Ca fait longtemps que je n'ai pas fait de Java, mais ça ne serait pas `Scanner.nextInt();` plutôt ?

            -
            Edité par Insonore 19 janvier 2018 à 13:31:41

            • Partager sur Facebook
            • Partager sur Twitter
            Hugo
              19 janvier 2018 à 14:16:58

              Oui, ça marche mais on peut l'améliorer en faisant comme je te l'ai conseillé. Voici ce que ça donne

              static List<Article> searchByIntervalle(int prixMin, int prixMax) {
                  return articles.stream()
                                 .filter(article -> article.getPrix() >= prixMin && article.getPrix() <= prixMax)
                                 .collect(Collectors.toList());
              }
              
              static void afficherResultat(List<Article> articles) {
                  if (articles.isEmpty()) {
                      // afficher "pas de résultats"
                  } else {
                      articles.forEach(Program::afficher); 
                      // afficher à redéfinir dans Program ou Article
                  }
              }

              Comme ça tu sépares le traitement des données et l'affichage. C'est plus lisible et plus facile à modifier ou réutiliser.

              • Partager sur Facebook
              • Partager sur Twitter
                19 janvier 2018 à 14:32:09

                HugoL.3 a écrit:

                System.out.print("Veuillez saisir un nombre\n> ");
                
                // l'utilisateur entre "Bonjour"
                // alors java va crash "java.util.InputMismatchException"
                
                int nbr = scanne.nextInt();
                
                System.out.print(nbr);


                Ca fait longtemps que je n'ai pas fait de Java, mais ça ne serait pas `Scanner.nextInt();` plutôt ?

                -
                Edité par HugoL.3 il y a environ 1 heure

                Ca dépend quel nom tu donnes quand tu décales ton scanner.

                La je l'ai décalé :

                static Scanner scanne = new Scanner(System.in);

                donc je l'ai nommer "scanne"

                brubru777 a écrit:

                Oui, ça marche mais on peut l'améliorer en faisant comme je te l'ai conseillé. Voici ce que ça donne

                static List<Article> searchByIntervalle(int prixMin, int prixMax) {
                    return articles.stream()
                                   .filter(article -> article.getPrix() >= prixMin && article.getPrix() <= prixMax)
                                   .collect(Collectors.toList());
                }
                
                static void afficherResultat(List<Article> articles) {
                    if (articles.isEmpty()) {
                        // afficher "pas de résultats"
                    } else {
                        articles.forEach(Program::afficher); 
                        // afficher à redéfinir dans Program ou Article
                    }
                }

                Comme ça tu sépares le traitement des données et l'affichage. C'est plus lisible et plus facile à modifier ou réutiliser.

                Je comprend pas où tu appellerais t'as méthode afficherResultat et je ne comprend pas comment tu as pensée.

                -
                Edité par _.Linxy._ 19 janvier 2018 à 14:34:08

                • Partager sur Facebook
                • Partager sur Twitter

                I'AM NOT A GEEK ❌ ! I'AM A GAMER 🎃🔥 !

                  19 janvier 2018 à 16:54:05

                  Dans ton code, tu appelles

                  Program.searchByIntervalle(prixMin, prixMax);

                  Ca sélectionne les articles et les affiche au fur et à mesure.

                  Avec mon code, il faudrait remplacer ça par

                  List<Article> selection = searchByIntervalle(prixMin, prixMax);
                  afficherResultat(selection);

                  L'avantage, c'est que

                  • tu peux utiliser la liste des articles sélectionnés pour faire autre chose (afficher dans une fenêtre, sauvvegarder dans un fichier ou autre chose)
                  • tu peux réutiliser afficherResultat avec d'autre types de recherche (produits par nom ou produits en stock, par exemple)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 janvier 2018 à 9:01:17

                    Salut,

                    Désolé de t'avoir pas répondu avant.

                    Merci pour ton code il fonctionne à merveille, par-contre je vais juste devoir me coller à la doc pour la partie du "searchByIntervalle" car je comprend pas tout, exemple :

                    return articles.stream()
                                       .filter(article -> article.getPrix() >= prixMin && article.getPrix() <= prixMax)
                                       .collect(Collectors.toList());

                    je savais pas que l'on pouvait faire un return comme ça et le .filter ainsi que le .collect je ne sais pas comment ils fonctionne.

                    Mais en tout cas merci pour ton aide.

                    Tu es un bosse ;).

                    Cordialement TTGamer.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    I'AM NOT A GEEK ❌ ! I'AM A GAMER 🎃🔥 !

                      22 janvier 2018 à 9:16:54

                      "filter" sélectionne les éléments du flux (stream) qui vérifient un certain prédicat et abandonne les autres.

                      "collect" sert à collecter les résultats dans une structure de donnée. Ici, une liste.

                      J'ai utilisé l'API fonctionnelle de Java 8 parce que tu l'avais toi-même utilisée dans ton code mais si tu as du mal à comprendre ce code, il vaut peut-^^etre mieux que tu utilises des boucles for classiques.

                      Ou sinon, tu peux regarder ce tutoriel.

                      https://openclassrooms.com/courses/2515616?status=waiting-for-publication

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 janvier 2018 à 9:23:41

                        Ah je vois mieux, merci.

                        Oui je pense que tu parle de la boucle 

                        articles.forEach() -> { });

                        en effet. J'ai compris comment fonctionne t'as solution et j'ai réussi à l'appliquer sur d'autre "search" merci pour t'as solution ^^

                        Et dernière petite questions : est-ce que tu connais un moyen pour évité que java crash quand l'utilisateur entre une valeur d'un mauvais type ?

                        • Partager sur Facebook
                        • Partager sur Twitter

                        I'AM NOT A GEEK ❌ ! I'AM A GAMER 🎃🔥 !

                          22 janvier 2018 à 10:24:12

                          Oui. Avec un try-catch, tu peux intercepter l'exception. Et avec une boucle do while, tu peux redemander la valeur.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 janvier 2018 à 10:38:40

                            brubru777 a écrit:

                            Oui. Avec un try-catch, tu peux intercepter l'exception. Et avec une boucle do while, tu peux redemander la valeur.

                            Je vais faire un autre sujet pour ça car là je sort du thème.

                            En tout cas merci pour ton aide ^^

                            -
                            Edité par _.Linxy._ 22 janvier 2018 à 11:01:12

                            • Partager sur Facebook
                            • Partager sur Twitter

                            I'AM NOT A GEEK ❌ ! I'AM A GAMER 🎃🔥 !

                            Récupérer un intervalle de valeur dans arraylist

                            × 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