随机化用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的答案。
我认为一些结构性的改变会有很大的帮助,让你更容易。 定义新类: Question
和Answer
。 让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); } }