Domanda

Sto cercando di leggere un file di testo in Java, in pratica un set di domande.Con quattro scelte e una risposta.La struttura assomiglia a questo:

domanda

l'opzione a

opzione b

opzione c

opzione d

risposta

Non ho problemi a leggere in questo modo:

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


}




}

Il codice sopra è prevedibile.Per il ciclo appena incrementi.E visualizza le domande sulla base di un ordine.

Quello che voglio fare è essere in grado di generare casualmente tramite il file di testo, ma mantenendo la stessa struttura.(q, a, b, c, d, e).Ma quando provo a fare questo:

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

E questo è il metodo che uso io per casualità:

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

C'è la possibilità che io ottiene un valore null.Cosa potete consigliare che vorrei fare in modo che non mi esce nessun null quando si cerca di randomizzare le domande?

Si può vedere tutto ciò che è di sbagliato con il mio programma?

È stato utile?

Soluzione

Si utilizzano tutti i tipi di numeri di magia, numeri di codice che non ha molto senso.

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

Questi dovrebbero essere tutti lo stesso numero, giusto?Se si dispone di 25 domande, si dovrebbe avere spazio per il 25, leggere i 25 e 25.

Come risolvere questo problema:

1 Effettuare una costante

public final static int NUMBER_OF_QUESTIONS = 25;

Quindi utilizzare che quando si effettua la matrice, leggere le domande e quando l'assunzione di un casuale:

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 di q.lunghezza

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

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

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

3 Utilizzare un Elenco / Collezione

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

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

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

Opzione 3 sarebbe la scelta migliore, questo è java dopotutto.Vedere Mike rispondere più in dettaglio nel fare questo più di Java.

Altri suggerimenti

Penso che un po ' di cambiamenti strutturali aiuterà molto e fare questo molto più facile per voi.Definire nuove classi: Question e Answer.Lasciate Question sono disponibili le opzioni e Answer all'interno di esso.Che oggetto di composizione.

Guardare il API per la raccolta.Con una Raccolta di Domande, è possibile utilizzare il metodo shuffle di casualità in una sola riga.Lasciate Java fare il lavoro per voi.

Così si potrebbe avere:

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

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

questions.shuffle();

Per abbellire un po ' di più sul perché si vuole fare questo perché...Se si desidera separare il vostro preoccupazioni il meglio che si può.Domande, risposte, e le opzioni sono tutte diverse preoccupazioni.La risposta dell'utente è una preoccupazione.La randomizzazione delle domande è una preoccupazione.La risposta la risposta dell'utente è una preoccupazione.

Essere un buon sviluppatore di software si sta andando a voler schematizzare tutte queste cose.Java costruire per la realizzazione di questo è la Classe.È possibile sviluppare le tue idee in modo relativamente autonomo all'interno della loro stessa classe.Quando si è soddisfatti con le vostre Classi, tutto quello che dovete fare è collegare i loro.Definire la loro interfacce, come parlano tra di loro.Mi piace definire le interfacce di prima, ma quando ho iniziato io, l'ho trovato un po ' più facile preoccuparsi più tardi.

Potrebbe sembrare un sacco di lavoro, con tutte le Classi e le interfacce e cosa no.Ci vorrà pochissimo tempo per farlo in questo modo quando si arriva bene.E la vostra ricompensa è la testabilità riusabilità.

Altre persone (Mike, Erick) hanno già suggerito meglio approcci a questo problema creando un nuovo Question classe aggiunta di domande per una collezione, e utilizzando il shuffle metodo per rendere loro.

Per quanto riguarda il perché si sono "ottenere un null" nel codice:Per quanto posso vedere il codice di esempio che è solo la lettura di due domande di un file:

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

Questo significa che le posizioni 0 e 1 nell'array si sono dati validi, mentre le posizioni da 2 a 49 conterrà null.

Più tardi, quando si tenta di randomize domande si chiama il tuo random metodo come questo:

int ran = random(1,25);

Questo returs un valore compreso tra 1 e 25, che potrà essere utilizzato come un indice di un array.

Se questo indice sembra essere '1', andrà tutto bene.Per tutti gli altri casi (da 2 a 25) a cui si accederà null i valori nell'array, e sempre delle eccezioni, quando cercando di giocare con questi valori.

Creare una classe per tenere una domanda e leggere il file in un array di questi oggetti.

Spezzare il problema in tre fasi.Il primo passo è quello di leggere il file di dati e l'archiviazione di tutti i dati in oggetti.Il secondo passo è quello di randomizzare l'ordine di tali oggetti.Il passo finale è quello di stampare.

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 matrice:

Collections.shuffle(questions);

Poi basta loop attraverso le domande e in uscita.

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

Creare una questione di classe come questo per mantenere i vostri dati:

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);
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top