Использование BufferedReader и Scanner для чтения текста

Я изучаю Java и использую BlueJ, поэтому мой вопрос относится к части задания, которое меня попросили выполнить. Некоторые из них работают, но у меня проблемы с другими частями. Я включу все, что я сделал в классе до сих пор, но сначала вот требования:

  1. Предложите пользователю выбрать соответствующий файл // готово и работает
  2. Используйте объекты BufferedReader и Scanner для чтения файла построчно // готово и считайте, что работает!
  3. По мере чтения каждой строки, содержащей имя и возраст бегуна, должен быть создан новый объект Runner, а его переменная экземпляра должна быть установлена ​​следующим образом: // Class Runner already created // Class MathatonAdmin - current class.

    • 3a) name - can be set directly using the value from the file. // tested with System.out.println and all values (in display panel) are shown (*).
    • 3б) возрастная группа - можно рассчитать по заданному возрасту: бегуны до 18 лет должны быть отнесены к категории юниоров, 55 лет и старше - к категории сеньоров, все остальные - по стандарту. // tested with System.out.println and all values (in display panel) are shown (*).
    • 3c) Экземпляр Runner должен быть добавлен в список, на который ссылается переменная экземпляра runners.

По сути, когда я запускаю предоставленный тестовый код:

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

Я должен видеть список бегунов, когда осматриваю маму; в настоящее время указано имя и возраст одного человека.

Так что мне нужна помощь с 3a - 3c. Как создать новый экземпляр Runner с указанными переменными, а затем добавить экземпляр Runner в список бегунов?

Я пробовал цикл for в цикле while, но, поскольку я угадываю цикл 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);
         }
      }
   }

}

person user3511057    schedule 08.04.2014    source источник


Ответы (3)


В вашем классе есть некоторые моменты, которые приводят к неправильному поведению вашей программы.

  1. В упражнении говорится, что вы должны создать список объектов бегуна как переменную экземпляра, верно? Посмотрите на бегунов переменной экземпляра вашего марафонского класса и посмотрите на его тип. ;)

  2. Ваш цикл while - хороший подход. Теперь внутри цикла while вы взаимодействуете с каждой строкой текстового файла, что эквивалентно одному бегуну, верно? Итак, зачем вам нужен цикл for? Вы можете использовать lineScanner для получения каждой части строки, нет необходимости во втором цикле, я пытаюсь дать вам структуру с псевдокодом

Строка имя_бегуна; возраст бегуна;

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

Надеюсь, это поможет вам немного.

person MeiSign    schedule 08.04.2014
comment
Попробую использовать ваш код. Что касается бегунов - если я правильно прочитал инструкции, это должно быть конфиденциальным. если вы имеете в виду список, то именно так его используют примеры, которые у меня есть. Если возникнут проблемы с любой из этих переменных, я свяжусь со своим наставником. А пока я благодарю вас за вашу помощь. - person user3511057; 08.04.2014

Вы создаете экземпляр Runner, но не устанавливаете имя переменных экземпляра и age/ageGroup для класса Runner. Для этого вы можете создать конструктор в классе Runner. Также вы должны переименовать свою переменную, так как бегуны уже используются.

Далее вы объявили бегунов как переменную экземпляра типа String. Но вам понадобится список. После того, как вы создали экземпляр Runner, вы можете добавить его в список.

person Gregor Koukkoullis    schedule 08.04.2014
comment
Спасибо за совет, но по моему заданию переменные не используются в классе Runner. Однако я воспользуюсь вашим советом по переименованию переменных бегунов. - person user3511057; 08.04.2014

Ваши переменные экземпляра неверны. Вам нужен список объектов, а не бегунов String. Также вам нужен экземпляр метода для возраста, а не экземпляр класса.

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

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

Я также согласен с MeiSign, вам не нужен цикл for внутри цикла while

person NotsoCleverAlex    schedule 09.04.2014
comment
Мне было интересно, как заставить список работать, поэтому ваш код определенно поможет. Спасибо. - person user3511057; 10.04.2014