随机化用Java读取的文本文件

我试图用Java读取一个文本文件,基本上是一组问题。 有四个选择和一个答案。 结构如下所示:

选项a

选项b

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

上面的代码是可预测的。 for循环只是递增。 它会根据订单显示问题。

我想要做的是能够随机化文本文件,但仍然保持相同的结构。 (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; } 

我有可能得到一个null。 您可以建议我这样做,以便在尝试随机化问题时不会出现空值?

你能看到我的程序有什么不对吗?

你使用所有类型的魔术数字 ,你的代码中的数字没有多大意义。

 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 

2使用q.length

 public static String[] q=new String[NUMBER_OF_QUESTIONS]; for(ar=0;ar 

3使用列表/集合

 public static List q=new List(); for(ar=0;ar 

选项3将是最佳选择,这是java毕竟。 有关更多详细信息,请参阅Mike的答案。

我认为一些结构性的改变会有很大的帮助,让你更容易。 定义新类: QuestionAnswer 。 让Question在其中有选项和Answer 。 这是对象组成。

查看Collection API 。 使用问题集合,您可以使用shuffle方法将它们随机化为一行。 让Java为您完成工作。

所以你可能有:

 Collection questions = new ArrayList(); questions.add(...); questions.add(...); questions.add(...); questions.shuffle(); 

为了更好地说明你为什么要这样做,这就是为什么……你想尽可能地分开你的顾虑 。 问题,答案和选项都是不同的问题。 用户的回答是一个问题。 问题的随机化是一个问题。 对用户响应的响应是一个问题。

作为一名优秀的软件开发人员,您将需要划分所有这些内容。 Java用于实现此目的的构造是Class。 您可以在自己的课程中相对独立地发展您的想法。 当您对课程感到满意时,您所要做的就是连接它们。 定义他们的界面 ,他们如何相互交谈。 我想首先定义接口,但是当我开始时,我发现稍后更容易担心它。

可能看起来很多工作,包括所有这些类和接口,什么不是。 当你变得好的时候,这样做只需要一小部分时间。 您的奖励是可测试性可重用性。

其他人(Mike,Erick)已经通过创建一个新的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值,并在尝试使用这些值时获取exception。

创建一个类来保存问题并将文件读入这些对象的数组中。

将问题分成三个步骤。 第一步是读入数据文件并将所有数据存储在对象中。 第二步是随机化这些对象的顺序。 最后一步是将它们打印出来。

 ArrayList questions = new ArrayList();
对于(AR = 0; AR <2; AR ++){
   Q = br.readLine();
  一个= br.readLine();
   B = br.readLine();
   C = br.readLine();
   d = br.readLine();
   String tempo = br.readLine();
   ANS = tempo.charAt(0);

   questions.add(新问题(q,a,b,c,d,ans));
 }

像这样随机化数组:

 Collections.shuffle(问题);

然后循环遍历问题并输出它们。

 for(问题q:问题){
   q.write();
  的System.out.println();  //问题之间的空格
 }

创建一个这样的问题类来保存您的数据:

公共课问题{
  私有字符串问题;
   private String option1;
   private String option2;
   private String option3;
   private String option4;
  私有字符串答案;

   public Question(String question,String option1,String option2,String option3,
                   String option4,String answer){
     this.question =问题;
     this.option1 = option1;
     this.option2 = option2;
     this.option3 = option3;
     this.option4 = option4;
     this.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(“答案:”+ this.answer);
   }
 }