Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remove des éléments d'une liste

J'ai une liste de question qui s'affiche aléatoirement mais reviennes

    6 mai 2019 à 17:15:13

    Bonjour, J'ai suivis un cours sur OpenClassroom où j'ai appris à faire une liste de question s'affiche aléatoirement, cependant certaines questions reviennes assez souvent. Je voudrais donc faire pour que ce soit aléatoire mais sans que les questions reviennent une seconde fois. Et quand il n'y a plus de question je voudrais afficher une pop-up pour dire que c'est finit. 
    public class Activity extends AppCompatActivity {
    
        private TextView mQuestionTextViewVe;
        private QuestionBankVe mQuestionBankVe;
        private QuestionVeriter mCurrentQuestionVe;
        private Button mbackButton;
        private ArrayList<String> arrayList;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_veriter);
    
            System.out.println("veriterActivity::onCreate()");
    
            mQuestionBankVe = this.generateQuestions();
    
            mQuestionTextViewVe = findViewById(R.id.activity_veriter_question_text);
    
            mCurrentQuestionVe = mQuestionBankVe.getQuestion();
            this.displayQuestion(mCurrentQuestionVe);
    
        private void displayQuestion(final QuestionVeriter question) {
            mQuestionTextViewVe.setText(question.getQuestion());
        }
    
        private QuestionBankVe generateQuestions() {
            QuestionVeriter question1 = new QuestionVeriter("Question");
    		QuestionVeriter question2 = new QuestionVeriter("Question");
    		QuestionVeriter question3 = new QuestionVeriter("Question");
    		
            return new QuestionBankVe(Arrays.asList( question1,
    		question2
    		question3
                    
            ));
        }
    }
    public class QuestionBankVe {
    
            private List<QuestionVeriter> mQuestionListVe;
            private int mNextQuestionIndexVe;
    
            public QuestionBankVe(List<QuestionVeriter> questionListVe) {
                mQuestionListVe = questionListVe;
    
                // Shuffle the question list
                Collections.shuffle(mQuestionListVe);
    
    
                mNextQuestionIndexVe = 0;
            }
    
            public QuestionVeriter getQuestion() {
                // Ensure we loop over the questions
                if (mNextQuestionIndexVe == mQuestionListVe.size()) {
                    mNextQuestionIndexVe = 0;
                }
    
    
                // Please note the post-incrementation
                return mQuestionListVe.get(mNextQuestionIndexVe++);
    
    
            }
        }
    
    
    public class QuestionVeriter {
    
        private String mQuestionVe;
    
    
    
        public QuestionVeriter(String question) {
            this.setQuestion(question);
        }
    
    
        public String getQuestion() {
            return mQuestionVe;
    
        }
    
        public void setQuestion(String question) {
            mQuestionVe = question;
        }
    
    
        @Override
        public String toString() {
            return "Question{" +
                    "mQuestion='" + mQuestionVe + '\'' +
                    '}';
        }
    }
    
    



    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2019 à 9:46:12

      Qu'as-tu essayé de faire ? Ou bloques-tu ?
      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2019 à 17:19:20

        En soit j'ai essayé d'utiliser un .remove() pour après avoir fait apparaître une question sur l'écran qu'elle ne puisse plus revenir. Par exemple c'est comme si on avait un sachet rempli de papier avec une question sur chaque papier qu'on pioche un papier, donc il n'y aurait plus la question dans le sachet. J'espère être assez clair, mais je bloque sur le fait d'enlever une des questions après l'avoir utiliser

        • Partager sur Facebook
        • Partager sur Twitter
          10 mai 2019 à 9:27:44

          Montre nous déjà ton code avec le fameux remove ;)
          • Partager sur Facebook
          • Partager sur Twitter
            10 mai 2019 à 10:15:10

            Justement j'ai fait plusieurs essais de remove. Je me demande même c'est possible de remove les éléments. Y aurait-il possibilité d'utiliser une autre façon de ne plus avoir une deuxième fois. Je suis actuellement en déplacement je mets mon code avec mes essais demain. Si jamais vous pensez avoir une solution ou une alternative n'hésitez pas car je suis un peu perdu. Je suis encore nouveau en programmation
            • Partager sur Facebook
            • Partager sur Twitter
              11 mai 2019 à 20:51:19

              Alors, j'ai essayé plusieurs choses qui n'ont absolument rien changer sauf à créer des erreurs. La première chose que j'ai essayé était de remove la mCurrentQuestionVe dans la mainActivity
              public class Activity extends AppCompatActivity {
              
                  private TextView mQuestionTextViewVe;
                  private QuestionBankVe mQuestionBankVe;
                  private QuestionVeriter mCurrentQuestionVe;
                  private Button mbackButton;
                  private ArrayList<String> arrayList;
              
              
                  @Override
                  protected void onCreate(Bundle savedInstanceState) {
                      super.onCreate(savedInstanceState);
                      setContentView(R.layout.activity_veriter);
              
                      System.out.println("veriterActivity::onCreate()");
              
                      mQuestionBankVe = this.generateQuestions();
              
                      mQuestionTextViewVe = findViewById(R.id.activity_veriter_question_text);
              
                      mCurrentQuestionVe = mQuestionBankVe.getQuestion();
                      this.displayQuestion(mCurrentQuestionVe);
              		mQuestionBankVe.remove(mCurrentQuestionVe);
              
                  private void displayQuestion(final QuestionVeriter question) {
                      mQuestionTextViewVe.setText(question.getQuestion());
                  }
              
                  private QuestionBankVe generateQuestions() {
                      QuestionVeriter question1 = new QuestionVeriter("Question");
              		QuestionVeriter question2 = new QuestionVeriter("Question");
              		QuestionVeriter question3 = new QuestionVeriter("Question");
              		
                      return new QuestionBankVe(Arrays.asList( question1,
              		question2
              		question3
                              
                      ));
                  }
              }
              Deuxième chose que j'ai essayé était de mettre le remove dans la QuestionBank 
              package com.gofflotg.alcoodmie.Models.QuestionBank;
              
              import com.gofflotg.alcoodmie.Models.Question.QuestionVeriter;
              
              import java.util.Collections;
              import java.util.List;
              
              public class QuestionBankVe {
              
                      private List<QuestionVeriter> mQuestionListVe;
                      private int mNextQuestionIndexVe;
              
                      public QuestionBankVe(List<QuestionVeriter> questionListVe) {
                          mQuestionListVe = questionListVe;
              
                          // Shuffle the question list
                          Collections.shuffle(mQuestionListVe);
              
              
                          mNextQuestionIndexVe = 0;
                      }
              
                      public QuestionVeriter getQuestion() {
                          // Ensure we loop over the questions
                          if (mNextQuestionIndexVe == mQuestionListVe.size()) {
                              mNextQuestionIndexVe = 0;
                          }
              
              
                          // Please note the post-incrementation
                          return mQuestionListVe.get(mNextQuestionIndexVe++);
                          mQuestionListVe.remove(mNextQuestionIndexVe);
                      }
                  }
              
              
              Voilà un peu près tout, ça peut paraître un peu débile mais je rappelle que je suis encore novice et j'ai pendant plusieurs heures essayer de régler ça par moi même mais j’avoue avoir un peu de mal avec la relation entre les class.
              • Partager sur Facebook
              • Partager sur Twitter
                12 mai 2019 à 9:34:37

                Salut,

                Si tu regardes ton QuestionBankVe, tu vois ceci dans le code:

                            // Please note the post-incrementation
                            return mQuestionListVe.get(mNextQuestionIndexVe++);
                            mQuestionListVe.remove(mNextQuestionIndexVe);

                Le return te retourne la prochaine question et s'arrête là. Donc ton code ne passe jamais par le remove.

                Je ne veux pas trop t'en dire pour te laisser faire l'exercice, bonne chance pour ta future lutte avec l'indice mNextQuestionIndexVe, qui risque bien d'arriver à une IndexOutOfBoundException ou quelque chose dans ce goût-là :-)

                ... allez, je suis pas vache, la classe List<E> dispose de la méthode isEmpty()

                -
                Edité par erozero 12 mai 2019 à 9:43:42

                • Partager sur Facebook
                • Partager sur Twitter
                  12 mai 2019 à 22:17:09

                  Je ne vois pas le rapport entre mon problème et la méthode isEmpty(), je cherche à afficher aléatoirement les questions grâce au collections.shuffle et ensuite ne plus avoir la phrase qui réapparaît. Donc je ne vois pas l'utilité de isEmpty puisqu'il sert juste si la liste est vide.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 mai 2019 à 21:14:50

                    Salut,

                    Je vais donc essayer d'être plus clair:

                    D'abord une question: est-ce que tu as compris que ton programme ne passe jamais par le remove?

                    Ensuite: Pour retourner la première question, le mieux est de commencer par remplacer le get par un remove:

                    return rmQuestionListVe.remove(0);

                    Pourquoi tu peux faire cela? Parce que

                    • Les éléments de ta collection sont indicés à partir de zéro. Pour enlever le premier, tu fais un remove(0).
                    • Après le remove, tous les éléments qui restent sont décalés "vers la gauche". Donc l'élément (1) devient (0), le (2) devient (1) et ainsi de suite. Ta collection rapetisse, donc ça na aucun sens de d'incrémenter ton indice à chaque passage. Si tu enlèves toujours le premiers élément c'est plus simple, et comme tu as trié la collection avec shuffle, peu importe l'ordre.
                    • Le remove retourne un objet, celui qui se trouvait à l'indice choisi. Donc ta méthode getQuestion retournera vraiment la question qui était à l'indice (0), avant que le (1) ne prenne sa place.
                    • Quant du auras enlevé successivement toutes les questions de ta collection, ta collection sera vide. Donc un remove(0) ou un get(0) donnera une erreur d'exécution. Ton programme va planter. C'est pour cela que perso je mettrais quelque chose comme :
                    if (mQuestionListVe.isEmpty()) {
                       return ""; // ou return null; ou return new Exception(...).
                    }else{
                       return mQuestionListVe.remove(0);
                    }
                    



                    Bonne chance

                    -
                    Edité par erozero 13 mai 2019 à 21:27:30

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 mai 2019 à 21:29:16

                      J'ai bien remplacé le .get par le .remove(0) cependant l'application crash malgré le fait que la liste est encore complète  est-ce normal ? Voici le code erreur :

                              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
                              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
                              at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
                              at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
                              at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
                              at android.os.Handler.dispatchMessage(Handler.java:106)
                              at android.os.Looper.loop(Looper.java:193)
                              at android.app.ActivityThread.main(ActivityThread.java:6669)
                              at java.lang.reflect.Method.invoke(Native Method)
                              at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
                           Caused by: java.lang.UnsupportedOperationException
                              at java.util.AbstractList.remove(AbstractList.java:161)
                              at com.gofflotg.alcoodmie.Models.QuestionBank.QuestionBankJNJSoft.getQuestion(QuestionBankJNJSoft.java:29)
                              at com.gofflotg.alcoodmie.Controller.JeJamais.jamaisSoftActivity.onCreate(jamaisSoftActivity.java:38)
                              at android.app.Activity.performCreate(Activity.java:7136)
                              at android.app.Activity.performCreate(Activity.java:7127)
                              at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
                              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
                              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
                              at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
                              at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
                              at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
                              at android.os.Handler.dispatchMessage(Handler.java:106) 
                              at android.os.Looper.loop(Looper.java:193) 
                              at android.app.ActivityThread.main(ActivityThread.java:6669) 
                              at java.lang.reflect.Method.invoke(Native Method) 
                              at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 



                      -
                      Edité par gabrielgofflot 14 mai 2019 à 20:06:01

                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 mai 2019 à 19:47:16

                        Salut à nouveau,

                        Je reconnais que je ne l'ai pas vue venir, celle-là. Ta commande Arrays.asList ne fournit pas une collection qui a toutes les méthodes qu'on attend généralement d'une liste.

                        Je te suggère de remplacer ce bout de code:

                               return new QuestionBankVe(Arrays.asList( question1,
                                question2
                                question3

                        par ceci:

                        ArrayList<QuestionVeriter> uneListe = new ArrayList<>();
                        uneListe.add(question1);
                        uneListe.add(question2);
                        uneListe.add(question3);
                        return new QuestionBankVe(uneListe);
                        


                        En espérant que cette fois-ci cela fonctionne (j'ai bien sûr pas pu essayer, je n'ai pas tout le projet qu'il me faut). Bonne chance.

                        -
                        Edité par erozero 15 mai 2019 à 19:52:22

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 mai 2019 à 20:49:44

                          Ah parfait tout fonctionne nickel, merci beaucoup. Pour le if s'il n'y a plus de question comment puis-je transférer l'information pour afficher une pop-up: c'est finit et dernière petite question comment vous êtes-vous formé ?

                          -
                          Edité par gabrielgofflot 16 mai 2019 à 19:25:36

                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 mai 2019 à 13:22:12

                            (1)

                            A moins que je n'aie mal compris ta question, tu cherches ceci: Toast.makeText(this, "Correct!", Toast.LENGTH_SHORT).show();

                            Plus de détails ici, le Toast est presque tout en bas

                            https://openclassrooms.com/fr/courses/4517166-developpez-votre-premiere-application-android/4579451-implementez-la-logique-de-jeu-dans-le-controleur

                            (2)

                            Pour Android studio, sur openclassrooms :-)

                            Pour le reste, plusieurs écoles, à divers moments de ma carrière, et par la suite pas mal de curiosité sur des sujets que je ne pratique pas au travail. Plus on connaît de choses plus on change facilement d'un outil ou langage à l'autre, mais c'est tellement vaste qu'on peut jamais tout savoir et surtout pas conseiller aujourd'hui ce qu'il vaut la peine d'étudier, parce qu'à la fin des études c'est déjà une autre tendance qui se dessine.

                            (3)

                            Si quelqu'un te tutoie, tu peux répondre par le tutoiement aussi, il n'y a pas de raison. Sur les forums c'est rare qu'on se gêne pour ça. C'est pas une question de respect, surtout pas, au contraire. C'est juste plus convivial

                            (4)

                            Donc je te souhaite une bonne suite, j'espère que ça te plaira de travailler tes "apps". Rien que pour savoir un peu comment c'est fait, ensuite on apprécie de voir ce que certains arrivent à en faire, et on accepte plus facilement les bugs :-)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 mai 2019 à 20:10:00

                              Excuse moi pour le vouvoiement, je me suis mal exprimé pour la pop up ce que je voulais te demander c'est comment fonctionne le return entre les class pour que  quand il n'y a plus de phrase faire un return pour lancer la pop up sur l'activity principal pour que l'activity ne crash pas, j'ai un peu de mal dans la compréhension du return. Merci beaucoup de toute ton aide je n'ai pas vraiment le temps de potasser en profondeur car je suis encore aux études secondaires l'équivalent du collège en France je pense et mon lancement d'indépendant.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 mai 2019 à 10:28:57

                                Salut,

                                Je comprends mieux ta question sur mes études. En fait je pense que tu as besoin d'un vrai cours sur java. On ne peut pas te donner un cours entier sur des posts, si cette matière t'intéresse vraiment, trouve-toi un vrai cours, en ligne ou dans une école.

                                Voici quand-même la réponse à ta question.

                                Une méthode a une signature et retourne une seule chose. Ta méthode getQuestion() doit donc retourner un objet de type QuestionVeriter. (= ton return doit retourner une question, rien d'autre). Regarde ton code, ça doit être clair. Parfois, on s'arrange pour passer outre en faisant un "return null". Mais ce n'est pas propre, parce que le programme s'attend à recevoir une question et n'a peut-être pas prévu que ça ne puisse pas marcher.

                                Il y a deux solutions. Dans la première, tu peux ajouter dans QuestionBankVe une méthode:

                                    public boolean hasMoreQuestions() {
                                        if (mQuestionListVe.isEmpty()) {
                                            return false;
                                        } else {
                                            return true;
                                        }
                                    }
                                

                                Dans ce cas, tu peux faire ton appel à getQuestion comme ceci,

                                        if(mQuestionBankVe.hasMoreQuestions()){
                                            // la tu fais ton getQuestion()
                                        }else{
                                            // ici, il n'y a plus de questions. a toi de savoir quoi faire avec ça
                                        }
                                

                                L'autre solution est de lever une exception dans la méthode getQuestion:

                                    public QuestionVeriter getQuestion() throws Exception {
                                        if (mQuestionListVe.isEmpty()) {
                                            throw new Exception("Il n'y a plus de questions dans la liste!");
                                        } else {
                                            return mQuestionListVe.remove(0);
                                        }
                                    }
                                

                                Et avec cette autre solution, l'appel se fera avec un try ... catch:

                                        try {
                                            mCurrentQuestionVe = mQuestionBankVe.getQuestion();
                                            // ici, afficher la question
                                        } catch (Exception ex) {
                                            // ici, il n'y a plus de questions;
                                        }
                                

                                A mon avis la 2ème solution est meilleure, parce que le programme appelant ne peut pas ignorer qu'il peut y avoir un "blème". Il est obligé de faire un try ... catch (sinon ça passe pas la compilation), donc de prévoir ce qu'il doit faire dans le cas où il reçoit l'exception.

                                Je te suggère fortement de chercher des explications sur les Exceptions en java, il y a des milliers d'exemples sur le web. D'ailleurs, pas besoin d'aller bien loin:

                                https://openclassrooms.com/fr/courses/26832-apprenez-a-programmer-en-java/22107-gerez-les-exceptions

                                Bon courage pour la suite.




                                -
                                Edité par erozero 19 mai 2019 à 15:13:00

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Remove des éléments d'une liste

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                • Editeur
                                • Markdown