2017-04-23 2 views
1

Ich bereitete ein Projekt vor, das von Trivia Crack inspiriert ist.Kann einen Wert von HashMap löschen, der zufällig ausgewählt wird

SporHmap ist eine HashMap, die 3 Werte (Fragen) speichert. In der actionListener-Methode erhält das Programm einen zufälligen Schlüssel aus der Hashmap und gibt Fragen und Antworten auf die JLabels und JButtons der QuestionClass aus.

Das Problem hier ist, ich möchte nicht, dass die Fragen wiederholt werden. Wenn eine Frage angezeigt wurde, sollte sie nicht erneut angezeigt werden. Ich benutzte tl.SporHmap.remove (randomValue); nachdem ein Wert ausgewählt wurde, aber es hat nichts geändert.

TriviaLinked tl = new TriviaLinked(); 
tl.SporHmap.put("Basketbolda 3 adımdan fazla atılan adıma ne denir?","Steps"); 
tl.SporHmap.put("Hindistan'ın ulusal sporu nedir?","Kriket"); 
tl.SporHmap.put("Süper Lig'de hakeme kırmızı kart gösteren futbolcu kimdir?","Salih Dursun"); 

Spor.addActionListener(new ActionListener() { 


    public void actionPerformed(ActionEvent e) { 

     QuestionClass q = new QuestionClass(); 
     q.getQFrame(); 


     Object[] values = tl.SporHmap.values().toArray(); 
     String randomValue = (String)values[r.nextInt(values.length)]; 



     if(tl.SporHmap.get("Hindistan'ın ulusal sporu nedir?").equals(randomValue)){ 
      q.label.setText("Hindistan'ın ulusal sporu nedir?"); 
      q.answer1.setText("Kriket"); 
      q.answer2.setText("Beyzbol"); 
      q.answer3.setText("Hokey"); 
      q.answer4.setText("Futbol"); 

      tl.SporHmap.remove(randomValue); 


      q.answer1.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "True Answer"); 
        score.setText("Score: "+scr++); 

        q.getQFrame().dispose(); 

        Spor.doClick(); 


       } 
      }); 
      q.answer3.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 
        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 
      q.answer2.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 


        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 
      q.answer4.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 


        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 



     } 



     else if(tl.SporHmap.get("Basketbolda 3 adımdan fazla atılan adıma ne denir?").equals(randomValue)){ 
      q.label.setText("Basketbolda 3 adımdan fazla atılan adıma ne denir?"); 
      q.answer1.setText("Serbest atış"); 
      q.answer2.setText("Dışarı çıkış"); 
      q.answer3.setText("Steps"); 
      q.answer4.setText("Faul"); 

      tl.SporHmap.remove(randomValue); 
      q.answer3.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "True Answer"); 
        score.setText("Score: "+scr++); 

        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 
      q.answer1.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 

        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 
      q.answer2.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 

        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 
      q.answer4.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 

        q.getQFrame().dispose(); 
        Spor.doClick(); 
} 
}); 

     } 
     else if(tl.SporHmap.get("Süper Lig'de hakeme kırmızı kart gösteren futbolcu kimdir?").equals(randomValue)){ 
      q.label.setText("Süper Lig'de hakeme kırmızı kart gösteren futbolcu kimdir?"); 
      q.answer1.setText("Erkan Zengin"); 
      q.answer2.setText("Özer Hurmacı"); 
      q.answer3.setText("Salih Dursun"); 
      q.answer4.setText("Aykut Demir"); 

      tl.SporHmap.remove(randomValue); 

      q.answer3.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "True Answer"); 
        score.setText("Score: "+scr++); 

        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 
      q.answer1.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 

        q.getQFrame().dispose(); 
        Spor.doClick(); 

       } 
      }); 
      q.answer2.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 


        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 

      q.answer4.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(null, "Wrong Answer"); 


        q.getQFrame().dispose(); 
        Spor.doClick(); 
       } 
      }); 

     } 

    } 
}); 

Hier ist meine QuestionClass Klasse:

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class QuestionClass { 
public JLabel label,label1; 
public JFrame questionFrame; 
public JButton answer1,answer2,answer3,answer4; 

public QuestionClass() { 
    questionFrame = new JFrame(); 
    questionFrame.setDefaultCloseOperation(questionFrame.HIDE_ON_CLOSE); 
    questionFrame.setLayout(new GridLayout(3,2)); 
    questionFrame.setSize(700, 350); 
    questionFrame.setVisible(true); 
    questionFrame.setLocationRelativeTo(null); 

    label = new JLabel(""); 
    questionFrame.add(label); 
    label1 = new JLabel(""); 
    questionFrame.add(label1); 
    answer1 = new JButton(""); 
    questionFrame.add(answer1); 
    answer2 = new JButton(""); 
    questionFrame.add(answer2); 
    answer3 = new JButton(""); 
    questionFrame.add(answer3); 
    answer4 = new JButton(""); 
    questionFrame.add(answer4); 
} 

public JFrame getQFrame() { 
    return questionFrame; 
} 
} 
+0

Ich nehme das als "Problem gelöst". Danke für die schnelle Annahme!Also, was war das Problem? – GhostCat

+0

Ich änderte ** tl.SporHmap.remove (randomValue); ** mit ** tl.SporHmap.remove ("Hindistan'ın ülusal sporu nedir?"); ** und es funktionierte. Es scheint nicht so logisch, aber es gibt noch kein Problem. Außerdem muss ich alle ** remove (randomValue) ** Teile mit ** remove (....) ** ändern. – afellay

+0

Das ist ... seltsam. Aber was auch immer. Schön, dass Sie eine Lösung gefunden haben. – GhostCat

Antwort

2

Sie Ansatz ist richtig: nach einer Frage zeigt; lösche es von der Karte.

Mit anderen Worten: füllen Sie einfach Ihre Karte mit genug Fragen zu sehen; wähle sie zufällig aus; und nachdem Sie eine Frage gestellt haben, remove() den entsprechenden Schlüssel von Ihrer Karte.

Aber es scheint, dass Sie

rufen
tl.SporHmap.remove(randomValue); 

Nur für ein Ihrer potentiellen Fälle. Dort sollte nicht eine Bedingung für diese Entfernung sein. Sie wählen nach dem Zufallsprinzip eine Frage aus, und dann entfernen Sie sie!

Darüber hinaus: Ihr "Objekt" -Modell ist nicht zu gut. Es hat keinen Sinn, diese Karte zu haben, sondern dann, wenn die Wahl getroffen wird! Stattdessen: könnten Sie eine QuizzQuestion Klasse erstellen, und ein QuizzQuestion hat:

  • Der Text Frage selbst
  • Die richtige Antwort
  • Die andere (falsche) Antworten

diese Klasse verwenden, können Sie kann alle Werte, die zusammen in solch ein QuizzQuestion-Objekt gehören, setzen.

Und dann brauchen Sie auch keine Karte; nur ein List<QuizzQuestion> Objekte werden es tun!

Ihren Kommentar Gegeben: im Grunde, diese möglichen Ursachen für das Problem sein könnte:

  • Wie gesagt; Sie dies nicht tun remove für alle möglichen Fälle
  • You „re-init“ Ihr HashMap zufällig (Bedeutung: Sie tatsächlich den Wert entfernen, aber Sie neu erstellen oder neu zu bevölkern die ganze Karte danach wieder)
  • ein konzeptionelles Fehler: Sie gehen davon aus, dass sich Ihr Programm an seinen letzten Zustand erinnern sollte; so dass wenn Sie das Programm schließen und neu starten; Es sollte keine Fragen anzeigen, die in einem vorherigen Lauf angezeigt wurden. Das wäre ein Missverständnis für dich.
+0

Danke für die Antwort. Mein Lehrer wollte, dass ich verknüpfte Listen und Hashmaps kombiniere. Es könnte ein besseres Modell geben, wie Sie es definiert haben. Übrigens, ich habe nicht den ganzen Code geteilt. Es gibt einen if-Fall für alle Schlüssel der hashmap. – afellay

+0

Ich habe meinen Code bearbeitet und einen größeren Teil davon geteilt. Ich würde geschätzt werden, wenn Sie es sich ansehen. – afellay

+0

Gnarf. Du hast all diese nutzlosen Leerzeilen zurückgebracht, die es nur schwerer machen zu lesen. Ich werde sehen, was ich tun kann. Aber erwarte nicht zu viel; Es ist schon spät hier. Aber wenn ich nichts finde und du nichts anderes hörst, werde ich vielleicht morgen nachsehen. Und Tipp: Vielleicht möchtest du einen ** Debugger ** verwenden ;-) – GhostCat

Verwandte Themen