使用BufferedReader和Scanner读取文本

时间:2014-04-08 13:36:07

标签: java bufferedreader bluej

我正在学习Java并使用BlueJ所以我的问题涉及我被要求做的任务的一部分。其中一些有效,但我遇到其他部分的问题。到目前为止,我将包括我在课堂上所做的一切,但首先是要求:

  1. 提示用户选择适当的文件//已完成并正常工作
  2. 使用BufferedReader和Scanner对象逐行读取文件//完成并假设正常工作!
  3. 当读取包含跑步者名称和年龄的每一行时,应创建一个新的Runner对象,并将其实例变量设置如下:// Class Runner already created                                                // Class MathatonAdmin - current class.

    • 3a)name - 可以使用文件中的值直接设置。 // tested with System.out.println and all values (in display panel) are shown (*).
    • 3b)ageGroup - 可以从给定的年龄开始计算:18岁以下的跑步者应该被分类为大三,55岁以上的老年人应该被分类为高级,其他所有人都是标准的。 // tested with System.out.println and all values (in display panel) are shown (*).
    • 3c)应将Runner实例添加到实例变量runners引用的列表中。
  4. 基本上当我运行提供的测试代码时:

    MarathonAdmin ma = new MarathonAdmin();
    ma.readInRunners();
    

    当我检查马时,我应该看到一个跑步者名单;目前列出了一个人的姓名和年龄。

    所以我需要帮助3a - 3c。如何使用所述变量创建Runner的新实例,然后将实例Runner添加到runners中的列表中?

    我在while循环中尝试过for循环,但由于我猜测for循环,我没有在变量ma中获得所需的列表。

    我正在使用System.out.println来测试我至少有正确的文件。

    任何帮助或建议都将不胜感激。

    MarathonAdmin课程:

    import java.util.*;
    import java.io.*;
    import ou.*;
    
    /**
    * MatharthonAdmin Class
    * 
    * @author Stephen Berry 
    * @version 28/03/14
    */
    public class MarathonAdmin
    {
       // instance variables 
       private String runners;
       private String age;
    
       /**
       * Constructor for objects of class MarathonAdmin
       */
       public void MarathonAdmin()
       {
          List<String> runners = new ArrayList<>();
       }
    
       public void readInRunners()
       {
          String pathName = OUFileChooser.getFilename();
          File aFile = new File(pathName);
          BufferedReader bufferedFileReader = null;
    
          try 
          {
             String currentLine;
             Scanner lineScanner;
             bufferedFileReader = new BufferedReader(new FileReader(aFile));
             currentLine = bufferedFileReader.readLine();
    
          while (currentLine != null)
             {
                lineScanner = new Scanner(currentLine);
                lineScanner.useDelimiter(",");
                runners = lineScanner.next();
                age = lineScanner.next();
    
                for (String aList: runners)
                {
                   Runner runners = new Runner();
    
                   if (Integer.parseInt(age) < 18)
                   {
                      System.out.println(currentLine + " : Junior");
                   }
    
                   if (Integer.parseInt(age) > 55)
                   {
                      System.out.println(currentLine + " : Senior");
                   }
    
                   if (Integer.parseInt(age) > 18 && Integer.parseInt(age) < 55)
                   {
                      System.out.println(currentLine + " : Standard");
                   }
    
                   currentLine = bufferedFileReader.readLine();
                }
             }
          }
    
          catch (Exception anException)
          {
             System.out.println("Error: " + anException);
          }
    
          finally
          {
             try
             {
                bufferedFileReader.close();
             }
    
             catch (Exception anException)
             {
                System.out.println("Error: " + anException);
             }
          }
       }
    
    }
    

3 个答案:

答案 0 :(得分:1)

你班上有一些要点导致你的计划失误。

  1. 练习说你应该创建一个跑步者对象列表作为实例变量吗?查看您的马拉松类的实例变量运行器并查看它的类型。 ;)

  2. 你的while循环是一个很好的方法。现在在while循环中,你可以为文本文件的每一行进行交互,这相当于一个运行符吗?那你为什么需要for循环呢?您可以使用lineScanner来获取该行的每个部分,而不需要第二个循环我尝试为您提供一个具有伪代码的结构

  3. String runnerName;     Int runnerAge;

    while (currentLine != null)
         {
            lineScanner = new Scanner(currentLine);
            lineScanner.useDelimiter(",");
    
            runnerName = lineScanner.next();
            runnerAge = lineScanner.next();
    
            runners = lineScanner.next();
            age = lineScanner.next();
    
            create new Runner Object
    
            set age and name of object according to the data you ve just read
    
            runners.add(Runnerobject) // <-- this line adds the object you ve just created to the list which is your instancevariable. Make sure that this variable really is a list :)
    
            currentLine = bufferedFileReader.readLine();
         }
        }
    

    希望这对你有所帮助。

答案 1 :(得分:0)

您创建了一个Runner实例,但是没有为Runner类设置实例变量name和age / ageGroup。您可以在Runner类中创建一个构造函数来执行此操作。此外,您应该重命名变量,因为已经使用了跑步者。

此外,您将runners声明为String类型的实例变量。但是你需要一个List。创建Runner实例后,您可以将该实例添加到列表中。

答案 2 :(得分:0)

您的实例变量不正确。您需要一个对象列表而不是String运行器。 此外,您需要一个年龄的方法实例而不是类实例。

private List<Runner> runners; // instance variables for a list of runner objects

runners = new ArrayList<Runner>(); // in the constructor

我也同意MeiSign,你不需要在while循环中使用for循环