Looping FileReader - PullRequest
       19

Looping FileReader

0 голосов
/ 22 октября 2011

Мне нужно читать текстовый файл построчно, за исключением того, что после 7 строк я хочу использовать прочитанное, назначив 7 строк 7 различным переменным.После того, как я назначил их, я хочу использовать переменные.Это самая простая часть, которую я знаю, как сделать, что застряло в том, что после того, как я использовал 7 переменных, я хочу иметь возможность назначить следующие 7 строк моего текстового файла тем же переменным и использовать ихснова.Я знаю, что должен использовать цикл (ы), но

  • как мне сделать так, чтобы он останавливался после 7 строк вместо того, чтобы просто переназначить строки переменным?
  • Должен ли я использовать 2 цикла?
  • Или что-то похожее на разрыв или, может быть, какую-то "паузу" я могу применить?
  • Или есть какой-то счетчик, который можно использовать с классом FileReader?
  • Или я должен его создать?

Вот что хочет наш учитель.


Парковочные талоны

Что делать: это задание основано на задаче Programming Challenge-8 на стр. 574с некоторыми изменениями, так что внимательно прочитайте эту брошюру.Вы можете работать в командах из 2 человек, если хотите.Сотрудничество и обсуждение будет полезно.Примечание. Это самая длинная и, вероятно, самая сложная программа курса, поэтому работайте осторожно и следуйте инструкциям.

Для этого задания вы разработаете набор классов, которые будут работать вместе, чтобы имитировать парковщика, выдающего парковочные талоны.на некоторые автомобили, припаркованные на метрах.Проблема может быть немного искусственной по сравнению с тем, как работают реальные счетчики и билеты.

Вы разработаете четыре отдельных класса и демонстрационную программу для запуска всего.Прочитайте все это назначение до конца, прежде чем начинать писать код Java.Вам необходимо понять структуру нескольких классов и понять, как организован файл данных.

Базовая настройка - это группа счетчиков парковки с припаркованными на них автомобилями в течение разных промежутков времени.

Каждый автомобиль приобретет некоторое время парковки, записанное в минутах.И каждый автомобиль будет припаркован в течение определенного промежутка времени, также записанного в минутах.Некоторые будут припаркованы на большее количество времени, чем они купили, а некоторые на меньшее количество времени, чем они купили.

Вот четыре класса, которые вам необходимо развить.• Класс ParkedCar: этот класс должен имитировать припаркованный автомобиль.Обязанности класса следующие: - знать марку автомобиля, модель, цвет, номер лицензии - знать идентификационный номер его парковочного счетчика.- Имеет метод toString () для сообщения идентифицирующей информации

• Класс ParkingMeter: этот класс будет имитировать парковочный счетчик.Класс отвечает следующим образом: - узнать свой собственный идентификационный номер счетчика - узнать количество приобретенных минут - узнать количество припаркованных минут - имеет метод toString () для сообщения своей информации

• Класс ParkingOfficer: этот класс должен имитировать парковщика, осматривающего припаркованные автомобили.Класс выполняет следующие обязанности: - Имеет две переменные экземпляра: одну для имени и одну для номера пропуска офицера. - Имеет конструктор с двумя параметрами для имени и номера пропуска парковщика. - Имеет метод toString (). - Имеет проверку.() метод, который получает объект ParkedCar и объект ParkingMeter в качестве параметров.Этот метод определяет, истекло ли время или нет. Time Если время истекло, он создает объект парковочного билета, который возвращается в качестве возвращаемого значения в exam ().Time Если время не истекло, оно возвращает ноль.

• Класс ParkingTicket: этот класс будет имитировать парковочный билет.Ответственность класса заключается в следующем: - Имеет конструкторich получает в качестве параметров объект ParkedCar, объект ParkingMeter и объект ParkingOfficer, которые используются для инициализации соответствующих переменных экземпляра в классе. Обязательно используйте конструкторы копирования для каждого из этих объектов параметров. - Этот класс также имеет переменную экземпляра для суммы штрафа. - Штраф рассчитывается конструктором ParkingTicket:  Штраф составляет 25 долларов США за первый час или часть часа, когда автомобиль незаконно припаркован, плюс 10 долларов США за каждый дополнительный час или часть часа, когда автомобиль незаконно припаркован.  Если время не истекло, штраф устанавливается на ноль. - Имеет метод toString (), который подготавливает тикет в удобном формате вашего дизайна (попробуйте сопоставить пример выходных данных, показанный ниже, или внесите свои собственные улучшения. Он должен сообщать марку, модель, цвет и номер лицензии незаконно припаркованного Кроме того, он сообщает сумму штрафа, а также имя и номер пропуска сотрудника полиции, выдавшего билет. В этом методе toString () вы должны эффективно использовать методы toString () для других классов в парковочном талоне (т. е. ParkedCar, ParkingMeter и ParkingOfficer)

Тестовый класс Напишите тестовый класс TicketDemo с main (), чтобы запустить симуляцию, используя приведенные выше классы, следующим образом: • Создать объект PoliceOfficer. Составьте свое собственное имя и номер значка. Вы можете закрепить это в своей тестовой программе или попросить пользователя ввести данные (на ваш выбор). • В цикле читайте данные из файла данных Asg-5_in.txt. (Примечание: файл Asg-5_inExplain.txt описывает, как интерпретировать содержимое файла.) o Считать один блок данных для автомобиля и счетчика и создать объект ParkedCar и объект ParkingMeter. o Вызвать метод exam () сотрудника парковки, используя в качестве аргументов объекты ParkedCar и Parking meter. Метод exam вернет тикет или ноль. o Если билет возвращается, вызовите метод toString (), чтобы распечатать билет на экране. o Если билет не выдан, распечатайте идентификационную информацию об автомобиле (используйте метод toString (). o Пусть цикл повторяется до тех пор, пока во входном файле больше не будет доступных данных.


Вот то, что я имею до сих пор, хотя я еще далеко не закончил.

ParkedCar класс:

public class ParkedCar{

private String make;
private String model;
private String color;
private String license;
private String meterID;

public String getMake(String make)
{
    this.make = make;
    return make;
}

public String getModel(String model)
{
    this.model = model;
    return model;
}

public String getColor(String color)
{
    this.color = color;
    return color;
}

public String getLicense(String license)
{
    this.license = license;
    return license;
}

public String getMeterID(String meterID)
{
    this.meterID = meterID;
    return meterID;
}

public String toString()
{
    String str = "\nMake: " + make + "\nModel: " + model + "\nColor: " + color +
                 "\nLicense: " + license + "\nMeter ID: " + meterID;
    return str;
}
}

ParkingMeter класс:

public class ParkingMeter{

private String meterID;
private int minsPurchased;
private int minsParked;

public String getMeterID(String meterID)
{
    this.meterID = meterID;
    return meterID;
}

public int getMinsPurchased(int minsPurchased)
{
    this.minsPurchased = minsPurchased;
    return minsPurchased;
}

public int getColor(int minsParked)
{
    this.minsParked = minsParked;
    return minsParked;
}

public String toString()
{
    String str = "\nMeter ID: " + meterID + "\nMinutes Purchased: " + minsPurchased +
                 "\nMinutes Parked: " + minsParked;
    return str;
}
}

ПарковкаОфисный класс:

public class ParkingOfficer{

private String officerName;
private String badgeNumber;

public ParkingOfficer(String officerName, String badgeNumber)
{
    this.officerName = officerName;
    this.badgeNumber = badgeNumber;
}

public ParkingOfficer(ParkingOfficer object2)
{
    officerName = object2.officerName;
    badgeNumber = object2.badgeNumber;
}


public void setParkingOfficer(String officerName, String badgeNumber)
{
    this.officerName = officerName;
    this.badgeNumber = badgeNumber;
}

public String toString()
{
    String str = "\nOfficer's Name: " + officerName + "\nOfficer's Badge Number: " + badgeNumber;
    return str;
}

}

Ответы [ 3 ]

3 голосов
/ 22 октября 2011
int lineCounter = 0;
int variableCounter = 7;
BufferedReader br = new BufferedReader(new FileReader(new File("your-file-here.txt")));
String line = "";
List<String> lineSavers = new ArrayList<String>();
while ((line = br.readLine()) != null) {
    lineSavers.add(line);
    ++lineCounter;
    if (lineCounter == variableCounter) {
        // do something with the lineSaver
        lineSavers.clear();
        linteCounter = 0;
        // start the cycle again.
    }
}

Есть много вещей, которые я здесь не рассматривал:

  1. Очистка ресурсов - я не закрывал читателя.
  2. Что произойдет, если выпрочитайте файл, число строк которого не делится равномерно на 7. Эти последние строки вы никогда не получите так, как я написал.
  3. Счетчик переменных с жестким кодом.Я бы сделал эту переменную для передачи.
  4. Не очень модульный;Я передал бы это имя файла и инкапсулировал бы все это в методе.
  5. Я бы попробовал более функциональный подход, при котором я возвращал бы то, что хотел, и затем работал с ним, а не смешивал чтение иОбработка вместе.
  6. Почему семь строк?Что ты с ними делаешь?Они действительно связаны таким образом, что лучше выразить их как объект?Вы, вероятно, не думаете о проблеме наилучшим образом.
1 голос
/ 22 октября 2011

Вы можете использовать commons-io, чтобы прочитать файл за один раз, а затем перебрать список.Немного примера кода:

public static void main(String[] args) {
  // Read the content of the file in one go
  InputStream input = null;
  // This is where the file content is stored
  List<String> lines = null; 
  try {
    input = new FileInputStream("input.txt");
    lines = IOUtils.readLines(new BufferedInputStream(input));
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    // Always (try to) close the file
    if (input != null) {
      try {
        input.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  if (lines != null) {
    String[] params = null; // per 7 lines
    for (int i = 0; i < lines.size(); i++) {
      int fromZeroToSixCounter = i % 7; 
      if ( fromZeroToSixCounter == 0 ) { 
        if (params != null) { 
          // the first time (i == 0) params is null and this will not execute
          doSomethingWithParams(params);
        }
        // new batch of 7 lines
        params = new String[7];
      }
      params[fromZeroToSixCounter] = lines.get(i);
    }
    if (params != null) {
      // the last batch 
      doSomethingWithParams(params);
    }
  }
}

public static void doSomethingWithParams(String[] params) {
  System.out.println("New batch");
  for (int i=0; i < params.length; i++) {
    System.out.println(params[i]);
  }
}
0 голосов
/ 22 октября 2011

Базовая структура будет выглядеть примерно так:

while (true) {
  String v1 = reader.readLine();
  if (v1 == null)
    break;
  String v2 = reader.readLine();
  ...
  String v7 = reader.readLine();
  /* Do what ever you want with v1 through v7. */
  ...
}
/* End of loop. */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...