Рандожирование текстового файла, прочитанное в Java

StackOverflow https://stackoverflow.com/questions/3890167

  •  28-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь прочитать текстовый файл в Java, в основном набор вопросов. С четырьмя вариантами и одним ответом. Структура выглядит так:

вопрос

Опция А.

Вариант Б.

Вариант C.

Опция D.

отвечать

У меня нет проблем, читая это так:

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


}




}

Код выше предсказуемо. Для петли только что увеличивается. И это отображает вопросы, основанные на заказе.

То, что я хочу сделать, это быть в состоянии рандомизировать через текстовый файл, но все же поддерживая ту же структуру. (Q, A, B, C, D, ANS). Но когда я пытаюсь сделать это:

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

И это метод, который я использую для рандогимизации:

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

Есть возможность, что я получаю нуль. Что вы можете порекомендовать, чтобы я сделал это, чтобы я не получил никакой нулевой, пытаясь рандомизировать вопросы?

Можете ли вы увидеть что-нибудь еще, что не так с моей программой?

Это было полезно?

Решение

Вы используете все виды волшебные номера, цифры в вашем коде, которые не имеют большого смысла.

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

Все они должны быть одинаковым числом, верно? Если у нас есть 25 вопросов, мы должны иметь место для 25, читать 25 и использовать 25.

Как это исправить:

1 сделать постоянную

public final static int NUMBER_OF_QUESTIONS = 25;

Затем используйте это при выполнении массива, читая вопросы и при принятии случайный:

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 Используйте Q.1

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

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

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

3 Используйте список / коллекцию

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

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

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

Вариант 3 был бы лучшим выбором, это Java japter. Подробнее см. Ответ Майка для более подробной информации о том, чтобы сделать эту еще Java.

Другие советы

Я думаю, что небольшие структурные изменения очень помогут и сделают это намного легче для вас. Определите новые классы: Question и Answer. Отказ Позволять Question есть варианты и Answer внутри этого. Это состав объекта.

Посмотрите Коллекция API. Отказ С набором вопросов вы можете использовать метод Shuffle для рандомизации их в одной строке. Пусть Java сделает работу для вас.

Так что у вас может быть:

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

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

questions.shuffle();

Чтобы украсить немного больше о том, почему вы хотели бы сделать это так, почему ... вы хотите отделить обеспокоенность Лучше всего вы можете. Вопросы, ответы и варианты являются разными проблемами. Ответ пользователя является заботой. Рандомизация вопросов является беспокойством. Ответ на ответ пользователя является заботой.

Будучи хорошим разработчиком программного обеспечения, вы хотите разделить все эти вещи. Строительство Java для достижения это класс. Вы можете разработать свои идеи относительно независимо внутри своего класса. Когда вы удовлетворены своими классами, все, что вам нужно сделать, это подключить их. Определить их интерфейсы, Как они разговаривают друг с другом. Я люблю сначала определить интерфейсы, но когда я начал, мне было немного легче беспокоиться об этом позже.

Может показаться много работы, со всеми этими классами и интерфейсами и чего нет. Это займет долю времени, чтобы сделать это таким образом, когда вы хорошо получаете. И ваша награда - это повторное использование жизнеспособности.

Другие люди (Майк, Эрик) уже предложили лучшие подходы к этой проблеме, создав новый Question класс, добавление вопросов в коллекцию и используя shuffle метод для рандомизации их.

Что касается того, почему вы «получаете нуль» в вашем коде: насколько я вижу в своем примере кода, вы читаете только два вопроса из файла:

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

Это означает, что позиции 0 и 1 в ваших массивах будут иметь допустимые данные, а позиции от 2 до 49 будут содержать null.

Позже, когда вы пытаетесь рандомизировать вопросы, вы называете свой random Метод такой:

int ran = random(1,25);

Это обрабатывает значение от 1 до 25, которое вы затем используете в качестве индекса массива.

Если этот индекс будет иметь «1», вы будете в порядке. Для всех других случаев (от 2 до 25) вы получите доступ к null Значения в ваших массивах и получают исключения при попытке играть с этими значениями.

Создайте класс для проведения вопроса и прочитайте файл в массив этих объектов.

Разбить проблему на три шага. Первый шаг - прочитать в файле данных и хранить все данные в объектах. Второй шаг - рандомизировать порядок этих объектов. Последний шаг - распечатать их.

ArrayList вопросы = новый ArrayList (); для (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); вопросы. Add (новый вопрос (Q, A, B, C, D, ANS)); }

Рандомизировать массив, как это:

Коллекции. Действительность (вопросы);

Тогда просто петлю через вопросы и выпустите их.

для (Вопрос Q: Вопросы) {q.write (); System.out.println (); // пространство между вопросами}

Создайте класс вопросов, например, для удержания ваших данных:

Вопрос общественного класса {личный строковый вопрос; Вариант частной строки1; Вариант частной строки2; Вариант частной строки3; Вариант частной строки4; Ответ в частном строке; Общественный вопрос (строковый вопрос, опция строки1, опция строки2, параметр строки3, параметр строки4, ответ строки) {this.question = вопрос; Это .Option1 = опция1; Это .Option2 = опция2; Это .Option3 = опция3; Это .Option4 = опция4; this.answer = ответ; } Общественная пустота Написать () {system.out.println (это. Шесть); System.out.println (это .option1); System.out.Println (это .Option2); System.out.println (это .Option3); System.out.Println (это .Option4); System.out.Println («Ответ:» + IS.Answer); }}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top