Problem Hashmap, glaub ich...

Iban

Grünschnabel
Hallo allerseits,

ich hab folgendes Problem. Ich programmier zur Zeit eine Art Klausurprogramm. Soweit ist alles ok bis auf eins.
Die Fragen und Antworten lese ich aus einer Access DB aus, die in einer Hashmap gespeichert werden und letztendlich an ein array übergeben werden. Soweit klappt das alles. Auf der Konsole kann ich auch mitlesen welche Fragen und Anworten ausgelesen werden und welche richtig sind etc. .
Für den Fall das nicht alle Fragen im Programm beantwortet werden, ist ein kleines Fenster da was aufploppt wenn ich auswerten will und halt noch eine oder mehr Frage/n offen hab.
Nun ist das Problem das , obwohl alle Fragen beantwortet sind, es bei einigen Fragen dieses Fenster aufploppt. Ich hab noch eine kleine Angabe mit reingeschrieben wo steht wieviel fragen beantwortet sind (wären) und da fehlen welche. Laut dem Programm was eine JProgressBar als Zähler der Fragen hat sind alle beantwortet. Laut Konsole die ja mitliest werden auch alle Fragen intern ausgewertet, also sind vorhanden.
Was mich stutzig macht, es ist nicht sporadisch sondern es sind spezielle Fragen/Antworten. Nehm ich diese aus der DB raus funktioniert alles einwandfrei.
Ich hab schon probiert und getestet zB. neue DB anlegen mit nur diesen Problemfragen, Fragen/Antworten etwas anders formulieren und so einiges, aber das Problem bleibt :suspekt: .
Mittlerweile bin ich am Ende meiner Ideen evtl fällt euch ja was ein :)

LG
Mathias
 
Hi,

also das Fenster ist nur ein JOptionPane. Und daran liegt es nicht. Ich hab das aber oben ausversehen falsch herum geschrieben und das Problem eingrenzen können (glaub ich) . Einige der Fragen waren sich von der Fragestellung her ähnlich, obs damit zu tun haben könnte?
Zum Programm noch:
Die DB wird ausgelesen und in einer ArrayList gepackt und zur Auswertung erst an die HashMap übergeben.
Ich habe 2 Klassen, eine Klasse wo das auslesen etc. stattfindet und eine wo der test dann abläuft und die Auswertung erfolgt (QuestionPanel). Code pack ich dann noch dazu.

Gruß Mathias

P.S. Ist immer spaßig einen Code von anderen weiterführen zu müssen vorallem als Anfänger :(
 
Einige der Fragen waren sich von der Fragestellung her ähnlich, obs damit zu tun haben könnte?
Jungs, hat einer grad die Wahrsagerkugel? Ich brauch die hier... Spaß beiseite: die Infos sind viel zu dürftig ("in eine ArrayList gepackt", "zur Auswertung an eine HashMap übergeben"), um Dir helfen zu können.
 
Zuletzt bearbeitet:
so jetzt aber..
die Klasse die ausliesst etc.

Code:
private static final int anzFragen=60;
private int[] arrayChoosedQuestions;
private List<Integer> listRightAnswers=new ArrayList<Integer>();
private HashMap<Integer,String> mapAnswers=new HashMap<Integer, String>();
private static HashMap<String,Boolean> mapUserResult=new HashMap<String, Boolean>();
private List<Integer> listQuestionPool=new ArrayList<Integer>();

//...

private void startDB()
 {
 dbCon.dblogin_msaccess("test.mdb");	
 dbSt=new DBStatement(dbCon.con);
 }
 
 /**
  * Methode zum Erstellen der einzelnen Tabs für die Fragen
  * @param reiter - JTabbedPane
  * @param themaID
  */
 private void buildTabs(JTabbedPane reiter,int themaID)
 {
  sysPrintln("ThemaID ausgewählt", ""+themaID);
  dbSt.db_result("Select FrageID from Fragen where ThemaID="+themaID);
 
  try
  {
   while(dbSt.result.next())
   {
	listQuestionPool.add(dbSt.result.getInt("FrageID"));	
   }

   sysPrintln("Fragen im Pool", ""+listQuestionPool.size());
   getZufallsfragen(listQuestionPool.size());

   sysPrintln("Insgesamt ausgewählte Fragen",""+arrayChoosedQuestions.length);

   for(int i=0;i<arrayChoosedQuestions.length;i++)
   {	 
	QuestionPanel pnl=new QuestionPanel(arrayChoosedQuestions[i]);
    dbSt.db_result("SELECT ANTWORTEN.*, FRAGEN.* FROM ANTWORTEN, FRAGEN where FRAGEN.FrageID=ANTWORTEN.FrageID and FRAGEN.FrageID="+arrayChoosedQuestions[i]);

	while(dbSt.result.next())
	{ 
	 pnl.setQuestion(dbSt.result.getString("Frage"));
     mapAnswers.put(dbSt.result.getInt("AntwortID"), dbSt.result.getString("Antwort"));
	 if(dbSt.result.getBoolean("Richtig"))
	 {
	  listRightAnswers.add(dbSt.result.getInt("AntwortID"));	
	 }
	}  
  
    pnl.setListRightAnswers(listRightAnswers);
    listRightAnswers.clear();
    pnl.setMapAnswers(mapAnswers);
    mapAnswers.clear();
    pnl.showPanel();
  
    reiter.addTab("F "+(i+1),pnl);	//+1 wegen Schleife, damit die Reiterbezeichnungen auch bei 1 beginnen
	sysPrintln("Tab für FrageID "+arrayChoosedQuestions[i]+" erzeugt","OK");
   }// end for
  }
  catch(SQLException e)
  {
   e.printStackTrace();
  }
  finally
  {
   dbCon.dbclose();
  }
 }

//...

 /**
  * Methode die Zufälligen ID's aus dem übergebenen Pool zieht
  * @param anzahlFragePool
  */
 private void getZufallsfragen(int anzahlFragePool)
 {
  int durchlaeufe=0;
  if(anzahlFragePool<anzFragen)
  {
   durchlaeufe=anzahlFragePool;
  }
  else durchlaeufe=anzFragen;
	
  Random r_zufall=new Random();
  int int_zahl;
  int int_zaehler=0;
  arrayChoosedQuestions=new int[durchlaeufe];
  barProgress.setMaximum(durchlaeufe);
  barUserResult.setMaximum(durchlaeufe);

  while(int_zaehler<durchlaeufe)
  {
   int_zahl=1 + Math.abs(r_zufall.nextInt()) % anzahlFragePool;
   boolean questionChoosed=false;
   for(int i=0; i<arrayChoosedQuestions.length;i++)
   {
    if(arrayChoosedQuestions[i]==listQuestionPool.get(int_zahl-1)) // pruefen ob zahl schon da ist
    {
	 questionChoosed=true;
	 break;  
    } 
   }	  
   if(!questionChoosed)
   {
    arrayChoosedQuestions[int_zaehler]=listQuestionPool.get(int_zahl-1);
    sysPrintln("FrageID ausgewählt",""+listQuestionPool.get(int_zahl-1));
    int_zaehler++;	  
   }	  
  } // ende der while schleife   
 }


 /**
  * Speichern der vom User beantworteten Fragen
  * @param frageID
  * @param status
  */
 public static void questionresult(String question, Boolean status)
 {
  mapUserResult.put(question, status);
 }


und aus der Klasse wo die Fragen beantwortet werden

Code:
private String question;
private HashMap<Integer,String> mapAnswers=new HashMap<Integer,String>();	
private List<Integer> listRightAnswers=new ArrayList<Integer>();
private List<String> listShuffleAnswers=new ArrayList<String>();
private HashMap<Integer,JCheckBox> mapChkAnswers=new HashMap<Integer,JCheckBox>();

//....

/**
 * Konstruktor des Panels
 * @param frageid - ID der Frage kann übergeben werden
 */
 public	QuestionPanel(int frageid)
 {
  this.frageID=frageid;	
 }

/**
 * Übergabe der Frage
 * @param question - Fragetext
 */
 public void setQuestion(String question)
 {
	this.question = question;
 }

/**
 * Übergabe der Antworten als Hashmap
 * es wird intern eine neue Hashmap angelegt da ja kein Zeiger möglich ist
 * @param mapanswers - Hashmap mit den Antworten
 */
 public void setMapAnswers(HashMap<Integer, String> mapanswers)
 {
  for(Map.Entry<Integer,String> map : mapanswers.entrySet())
  {
   this.mapAnswers.put(map.getKey(), map.getValue());
  }
 }

/**
 * Übergabe der richtigen Antworten als Liste
 * es wird intern eine neue Liste angelegt da ja kein Zeiger möglich ist
 * @param listrightanswers - Liste mit den richtigen Antworten
 */
 public void setListRightAnswers(List<Integer> listrightanswers)
 {
  for(int i=0; i<listrightanswers.size();i++)
  {
   this.listRightAnswers.add(listrightanswers.get(i));
   Application.sysPrintln("Für Tab der FrageID "+frageID+" wäre folgende AntwortID richtig",""+listrightanswers.get(i)); 
  }
 }
 
Zurück