我试图用
Java读取一个文本文件,基本上是一组问题.有四个选择和一个答案.结构如下所示:
question
option a
option b
option c
option d
answer
我这样读它没有问题:
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.你可以建议我这样做,以便在尝试随机化问题时不会出现空值?
你能看到我的程序有什么不对吗?
解决方法
您在代码中使用了所有类型的
magic numbers,这些数字没有多大意义.
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.length
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毕竟.有关更多详细信息,请参阅Mike的答案.