Frage

Ich versuche, eine Textdatei in Java zu lesen, im Grunde eine Reihe von Fragen. Mit vier Auswahlmöglichkeiten und eine Antwort. Die Struktur sieht wie folgt aus:

  

Frage

     

Option a

     

Option b

     

Option c

     

Option d

     

Antwort

Ich habe keine Probleme, es auf diese Weise zu lesen:

public class rar{
public static String[] q=new String[50];
public static String[] a=new String[50];
public static String[] b=new String[50];
public static String[] c=new String[50];
public static String[] d=new String[50];
public static char[] ans=new char[50];
public static Scanner sr= new Scanner(System.in);


public static void main(String args[]){
int score=0;
try {
             FileReader fr;
      fr = new FileReader (new File("F:\\questions.txt"));
      BufferedReader br = new BufferedReader (fr);
int ar=0;
      for(ar=0;ar<2;ar++){
      q[ar]=br.readLine();
      a[ar]=br.readLine();
      b[ar]=br.readLine();
      c[ar]=br.readLine();
      d[ar]=br.readLine();
    String tempo=br.readLine();
    ans[ar]=tempo.charAt(0);






        System.out.println(q[ar]);
        System.out.println(a[ar]);
        System.out.println(b[ar]);
        System.out.println(c[ar]);
        System.out.println(d[ar]);
        System.out.println("Answer: ");
        String strans=sr.nextLine();
char y=strans.charAt(0);
if(y==ans[ar]){
    System.out.println("check!");
score++;
System.out.println("Score:" + score);
}else{
System.out.println("Wrong!");
}

      }
      br.close();
    } catch (Exception e) { e.printStackTrace();}


}




}

Der obige Code ist vorhersehbar. Die for-Schleife inkrementiert gerade. Und es zeigt die Fragen basierend auf Bestellung.

Was ich tun möchte, ist in der Lage sein, durch die Textdatei randomisieren, aber immer noch die gleiche Struktur beibehalten wird. (Q, a, b, c, d, AM). Aber wenn ich versuche, dies zu tun:

int ran= random(1,25);
   System.out.println(q[ran]);
        System.out.println(a[ran]);
        System.out.println(b[ran]);
        System.out.println(c[ran]);
        System.out.println(d[ran]);
        System.out.println("Answer: ");
        String strans=sr.nextLine();
char y=strans.charAt(0);
if(y==ans[ran]){
    System.out.println("check!");
score++;
System.out.println("Score:" + score);
}else{
System.out.println("Wrong!");
}

Und das ist die Methode, die ich benutze für Randomisierung:

public static int random(int min, int max){
    int xx;
    xx= (int) ( Math.random() * (max-min + 1))+ min;
    return xx;
    }

Es gibt die Möglichkeit, dass ich eine Null erhalten. Was können Sie empfehlen, dass ich so tun würde, dass ich keine Null erhalten, wenn die Fragen zu randomisieren versuchen?

Können Sie sich etwas anderes zu sehen, die mit meinem Programm falsch ist?

War es hilfreich?

Lösung

Sie nutzen alle Arten von magischen Zahlen , Zahlen im Code , die nicht viel Sinn machen.

public static String[] q=new String[50]; //why make an array to hold 50 questions?

//... 

for(ar=0;ar<2;ar++){ //why read 2 questions?

//...

int ran= random(1,25); //why take one of 25 questions?
System.out.println(q[ran]);

Diese sollten alle die gleiche Nummer, richtig? Wenn wir 25 Fragen haben, sollten wir Platz für 25 haben, lesen 25 und 25 verwendet werden.

Wie dieses Problem zu beheben:

1 Stellen Sie eine Konstante

public final static int NUMBER_OF_QUESTIONS = 25;

Verwenden Sie dann, dass, wenn das Array zu machen, die Fragen zu lesen und wenn einen gelegentlichen unter:

public static String[] q=new String[NUMBER_OF_QUESTIONS];

for(ar=0;ar<NUMBER_OF_QUESTIONS;ar++){

int ran= random(1,NUMBER_OF_QUESTIONS);

2 Verwenden Sie q.length

public static String[] q=new String[NUMBER_OF_QUESTIONS];

for(ar=0;ar<q.length;ar++){

int ran= random(1,q.length);

3 Wählen Sie eine Liste / Sammlung

public static List<String> q=new List<String>();

for(ar=0;ar<q.size();ar++){

int ran= random(1,q.size());

Option 3 wäre die beste Wahl sein, das ist Java afterall. Siehe Mike Antwort für weitere Einzelheiten in diesen mehr Java zu machen.

Andere Tipps

ich denke, ein wenig strukturelle Veränderungen sehr viel helfen und machen dies viel einfacher für Sie. Definieren Sie neue Klassen: Question und Answer. Lassen Sie Question die Optionen und Answer innerhalb davon. Das ist Aufgabe Zusammensetzung.

Blick in die Sammlung API . Mit einer Sammlung von Fragen, können Sie die Shuffle-Methode verwenden, sie in einer Zeile randomisieren. Lassen Sie Java tun, um die Arbeit für Sie.

So haben Sie vielleicht:

Collection<Question> questions = new ArrayList<Question>();

questions.add(...);
questions.add(...);
questions.add(...);

questions.shuffle();

Um ein wenig mehr über verschönern, warum Sie wollen würde es dieses warum tun ... Sie möchten Ihre Bedenken trennen, die gut Sie können. Fragen, Antworten und Optionen sind alle unterschiedlichen Anliegen. Die Antwort des Benutzers ist ein Problem. Die Randomisierung der Fragen ist ein Anliegen. Die Antwort auf die Antwort des Benutzers ist ein Problem.

Als eine gute Software-Entwickler, wirst du all diese Dinge compartmentalize wollen. Java-Konstrukt um dies zu erreichen ist die Klasse. Sie können Ihre Ideen relativ unabhängig in ihrer eigenen Klasse entwickeln. Wenn Sie mit Ihren Klassen zufrieden sind, alles, was Sie tun müssen, ist, sie zu verbinden. Definieren Sie ihre Schnittstellen , wie sie miteinander reden. Ich mag die Schnittstellen zunächst definieren, aber als ich begann, fand ich es ein wenig leichter zu befürchten, dass später.

mag wie eine Menge Arbeit scheint, mit all diesen Klassen und Schnittstellen und was nicht. Es wird einen Bruchteil der Zeit in Anspruch nimmt es auf diese Art und Weise zu tun, wenn Sie gut zu bekommen. Und euer Lohn ist Testbarkeit Wiederverwertbarkeit.

Andere Personen (Mike, Erick) bereits vorgeschlagen, nähern sich besser für dieses Problem durch eine neue Question Klasse erstellen, Hinzufügen von Fragen zu einer Sammlung und Verwendung der shuffle Methode, um sie randomisieren.

In Bezug auf, warum Sie in Ihrem Code „einen Null bekommen“: Soweit ich in Ihrem Beispielcode sehen Sie nur lesen zwei Fragen aus der Datei:

for (ar=0;ar<2;ar++) {
    [...]
}

Das bedeutet, dass Positionen 0 und 1 in Ihren Arrays gültige Daten haben, während die Positionen 2-49 null enthalten werden.

Wenn Sie später versuchen, Fragen randomisieren Sie Ihre random Methode wie folgt aufrufen:

int ran = random(1,25);

Diese returs ein Wert zwischen 1 und 25, die Sie dann als Array-Index verwendet werden.

Wenn dieser Index sein geschieht ‚1‘ werden Sie in Ordnung sein. In allen anderen Fällen (2 bis 25) finden Sie null Werte in Arrays zugreifen, und Ausnahmen, wenn ich versuche mit diesen Werten zu spielen.

Erstellen Sie eine Klasse eine Frage zu halten und die Datei in ein Array dieser Objekte zu lesen.

Brechen Sie das Problem in drei Schritten. Der erste Schritt ist in der Datendatei und speichert alle Daten in Objekten zu lesen. Der zweite Schritt ist die Reihenfolge der Objekte randomisieren. Der letzte Schritt ist, sie heraus zu drucken.

ArrayList questions = new ArrayList();
for(ar=0;ar<2;ar++){
  q=br.readLine();
  a=br.readLine();
  b=br.readLine();
  c=br.readLine();
  d=br.readLine();
  String tempo=br.readLine();
  ans=tempo.charAt(0);

  questions.add(new Question(q, a, b, c, d, ans));
}

Randomize das Array wie folgt:

Collections.shuffle(questions);

Dann einfach eine Schleife durch die Fragen und gibt ihnen.

for (Question q: questions) {
  q.write();
  System.out.println(); // space between questions
}

Erstellen Sie eine Frage Klasse wie folgt Ihre Daten zu halten:

public class Question {
  private String question;
  private String option1;
  private String option2;
  private String option3;
  private String option4;
  private String answer;

  public Question(String question, String option1, String option2, String option3,
                  String option4, String answer) {
    this.question = question;
    this.option1 = option1;
    this.option2 = option2;
    this.option3 = option3;
    this.option4 = option4;
    this.answer = answer;
  }

  public void write() {
    System.out.println(this.question);
    System.out.println(this.option1);
    System.out.println(this.option2);
    System.out.println(this.option3);
    System.out.println(this.option4);
    System.out.println("Answer: "+this.answer);
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top