代码之家  ›  专栏  ›  技术社区  ›  user225269

用Java读取随机文本文件

  •  6
  • user225269  · 技术社区  · 16 年前

    问题

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

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

    有可能我得到一个空值。你有什么建议我这样做,以使我在尝试随机化问题时不为空?

    你能看到我的程序还有什么问题吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Ishtar    16 年前

    你用各种各样的 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);
    

    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的答案,以获得更多关于使这个更为Java的详细信息。

        2
  •  4
  •   Andrzej Doyle    16 年前

    我认为一点结构上的改变会对你有很大的帮助,也会让你更容易做到这一点。定义新类: Question 和 Answer 问题 回答 在里面。这是物体组合。

    Collection API . 对于一组问题,您可以使用shuffle方法将它们随机化为一行。让Java为您做这项工作。

    Collection<Question> questions = new ArrayList<Question>();
    
    questions.add(...);
    questions.add(...);
    questions.add(...);
    
    questions.shuffle();
    

    为了更好的解释你为什么要这么做,为什么。。。 尽你所能。问题、答案和选项都是不同的关注点。用户的反应令人担忧。这些问题的随机性令人担忧。对用户响应的响应是一个问题。

    作为一个优秀的软件开发人员,你需要把所有这些事情划分开来。Java实现这一点的构造是类。你可以在他们自己的班级里相对独立地发展你的想法。当你对你的课程感到满意时,你所要做的就是把它们联系起来。定义他们的 接口

    可能看起来需要做很多工作,包括所有这些类和接口等等。当你做得好的时候,用这种方法只需要一小部分时间。你的回报是可测试性和可重用性。

        3
  •  2
  •   Grodriguez    16 年前

    其他人(Mike,Erick)已经提出了解决这个问题的更好方法,创建了一个新的 Question shuffle 方法随机分组。

    关于为什么在代码中“得到一个空值”:就我在示例代码中所看到的,您只从文件中读取了两个问题:

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

    null .

    稍后,当你试图随机化你的问题时 random

    int ran = random(1,25);
    

    这将返回一个介于1和25之间的值,然后将其用作数组索引。

    如果这个索引恰好是'1',你就没事了。对于所有其他情况(2到25),您将访问 无效的 数组中的值,并在尝试使用这些值时获取异常。

        4
  •  1
  •   Erick Robertson    16 年前

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

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

    随机排列如下:

    Collections.shuffle(questions);
    

    然后把问题循环输出。

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

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

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