Pregunta

Estoy intentando leer un archivo de texto en Java, básicamente un conjunto de preguntas. Con cuatro opciones y una respuesta. Las miradas estructura como esta:

  

pregunta      

opción a

     

opción b

     

La opción C

     

La opción D

     

Respuesta

No tengo ninguna lectura de ese modo problemas:

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();}


}




}

El código anterior es predecible. El bucle for solo incrementos. Y muestra las preguntas basadas en orden.

Lo que quiero hacer es ser capaz de cambiar aleatoriamente a través del archivo de texto, pero manteniendo la misma estructura. (Q, a, b, c, d, American National Standard). Pero cuando trato de hacer esto:

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!");
}

Y este es el método que utilizo para aleatorizar:

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

Existe la posibilidad de que llegue un nulo. ¿Qué se puede recomendar que lo haría de manera que no consigo ninguna nula cuando se trata de cambiar aleatoriamente las preguntas?

Se puede ver todo lo que está mal con mi programa?

¿Fue útil?

Solución

Se utiliza todo tipo de números mágicos , números de su código que no tiene mucho sentido.

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]);

Todo esto debe ser el mismo número, ¿verdad? Si tenemos 25 preguntas, debemos tener espacio para 25, 25 y leer utilizar 25.

¿Cómo solucionar este problema:

1 Hacer una constante

public final static int NUMBER_OF_QUESTIONS = 25;

A continuación, utilice la hora de hacer que la matriz, la lectura de las preguntas y cuando se toman al azar:

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 Uso 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 Uso de una lista / Colección

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

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

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

La opción 3 sería la mejor opción, esto es después de todo java. Véase la respuesta de Mike para más detalle al hacer esta más Java.

Otros consejos

Creo que un poco cambios estructurales ayudarán mucho y hacer esto mucho más fácil para usted. Definir nuevas clases: Question y Answer. Deje Question tiene las opciones y dentro de ella Answer. Esa es la composición de objetos.

Mira en la API Colección . Con una colección de preguntas, puede utilizar el método aleatorio para seleccionar al azar en una sola línea. Deje de Java haga el trabajo por usted.

Por lo que podría tener:

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

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

questions.shuffle();

Para embellecer un poco más acerca de por qué desea hacerlo de esta la razón por ... Desea separar sus preocupaciones lo mejor que pueda. Preguntas, respuestas, y las opciones son preocupaciones diferentes. La respuesta del usuario es una preocupación. La asignación al azar de las preguntas es una preocupación. La respuesta a la respuesta del usuario es una preocupación.

Al ser un desarrollador de software bueno, vas a querer compartimentar todas estas cosas. constructo de Java para lograr esto es la clase. Puede desarrollar sus ideas de forma relativamente independiente dentro de su propia clase. Cuando esté satisfecho con sus clases, todo lo que tiene que hacer es conectarlos. Definir su las interfaces , la forma en que se comunican entre sí. Me gusta definir las interfaces principio, pero cuando empecé, me pareció un poco más fácil que preocuparse de eso más tarde.

puede parecer mucho trabajo, con todas estas clases e interfaces y qué no. Que va a tomar una fracción del tiempo para hacerlo de esta manera cuando llegue bien. Y su recompensa es la capacidad de prueba reutilización.

Otras personas (Mike, Erick) ya han sugerido mejores enfoques a este problema mediante la creación de una nueva clase Question, añadiendo preguntas a una colección, y utilizando el método shuffle selecciona aleatoriamente a ellos.

En cuanto a por qué está "recibiendo un nulo" en el código: Por lo que se puede ver en el código de ejemplo solamente se está leyendo dos preguntas del archivo:

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

Esto significa que las posiciones 0 y 1 en las matrices tendrán datos válidos, mientras que las posiciones 2 a 49 contendrán null.

Más tarde, cuando intenta cambiar aleatoriamente preguntas llama a su método random como esto:

int ran = random(1,25);

Este returs un valor entre 1 y 25, que luego se utiliza como un índice de la matriz.

Si este índice pasa a ser '1' que va a estar bien. Para todos los demás casos (2 a 25) que va a acceder valores null en sus matrices, y conseguir excepciones cuando se trata de jugar con estos valores.

Crear una clase para contener una pregunta y leer el archivo en una matriz de estos objetos.

Romper el problema en tres pasos. El primer paso es leer en el archivo de datos y almacenar todos los datos en los objetos. El segundo paso es para aleatorizar el orden de esos objetos. El paso final es imprimirlos.

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 la matriz de esta manera:

Collections.shuffle(questions);

A continuación, sólo bucle a través de las preguntas y salida de ellos.

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

Crear una clase de pregunta como ésta para mantener sus datos:

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);
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top