2011-10-22 104 views
0

我必须逐行读取文本文件,除了7行之后我想使用通过将7行分配给7个不同变量来读取的内容。一旦我分配了它们,我想使用这些变量。这是很容易的部分,我知道该怎么做,我坚持的是,在使用7个变量之后,我希望能够将我的文本文件的下7行分配给相同的变量,并使用它们再次。我知道我必须使用循环(一个或多个),但是,循环文件读取器

  • 我怎么让它在7线,而不仅仅是重新分配线的变量停下来?
  • 我应该使用2个循环吗?
  • 还是有类似的休息或可能某种“暂停”我可以申请?
  • 或者是否有某种类型的计数器可以与FileReader类一起使用?
  • 或者我应该创建一个吗?

这是我们的老师想要的。


停车票

怎么办: 这种分配是基于编程挑战赛的问题,8 574页上的一些修改,以便仔细阅读本讲义。如果您愿意,您可以在2人的团队中工作。合作和讨论会有帮助。注意:这是课程中最长,也是最困难的课程,因此请仔细阅读并按照说明进行操作。

对于本作业,您将设计一组类,这些类一起工作来模拟停车员向停放在米处的一些汽车发放停车票。与真实的仪表和门票的工作方式相比,这个问题可能有点虚假。

您将设计四个独立的类和一个演示程序来运行一切。在开始编写Java代码之前,阅读完整的任务到最后。您需要了解几个类的结构并理解数据文件的组织方式。

基本设置是一组停车计时器,停放在不同时间的汽车上。

每辆车都会在几分钟内购买一些停车时间。而且每辆车都会停放一段时间,并在几分钟内记录下来。有些会停放比购买更多的时间,有些会比购买更少的时间。

以下是您需要开发的四个类。 •ParkedCar Class:该课程应模拟停放的汽车。该课程的职责如下: - 了解汽车的品牌,型号,颜色,许可证号 - 了解其停车收费表的身份号码。 - 有一个toString()方法来报告其识别信息

•ParkingMeter类:该类将模拟停车计时器。该班的职责如下: - 了解自己的电表编号 - 要知道已购买的分钟数 - 要知道停放的分钟数 - 有一个toString()方法来报告其信息

•ParkingOfficer班:该班级应该模拟停车员检查停放的车辆。该类的职责如下: - 有两个实例变量:一个用于名称和一个用于警官的徽章号码 - 具有用于停车员姓名和徽章号码的两个参数的构造函数 - 具有toString()方法 - 具有一个接收ParkedCar对象和ParkingMeter对象作为参数的examine()方法。该方法确定时间是否已过期 如果时间已到,它会创建一个停车标签对象,它将作为返回值(来自examine())返回。 ▪如果时间未到期,则返回空值。

•ParkingTicket Class:该课程将模拟停车票。该课程的职责如下: - 具有一个构造函数,该构造函数接收一个ParkedCar对象,一个ParkingMeter对象和一个ParkingOfficer对象,用于初始化该类中的相应实例变量。一定要为每个参数对象使用复制构造函数。 - 这个类也有罚款金额的实例变量。 - 罚款由ParkingTicket构造函数计算: 车辆非法停放的第一小时或部分时间的罚款为25美元,车辆非法停放时每增加一小时或部分时间加上10美元。 如果时间未到期,则罚款设置为零。 - 有一个toString()方法,以您设计的有用格式准备票证(尝试匹配下面显示的示例输出或进行自己的改进),它必须报告非法的制造商,型号,颜色和许可证编号它还会报告罚款金额以及发放罚单的警察的姓名和徽章号码。在这个toString()方法中,您必须有效地使用toString()方法为停车罚单中的其他课程即ParkedCar的ParkingMeter和ParkingOfficer)

测试类 写测试类,TicketDemo,与主()使用上述类别如下运行仿真: •创建一个警察的对象让你自己的名字和证件号码,你可以把它连接到你的测试程序中r询问用户输入数据(您的选择)。 •在循环中从数据文件Asg-5_in.txt中读取数据。 (注意:文件Asg-5_inExplain.txt描述了如何解释文件内容。) o读取汽车和仪表的一个数据块,并创建一个ParkedCar对象和一个ParkingMeter对象 o致电停车员examine()方法使用ParkedCar和Parking meter对象作为参数。检查方法将返回一个票证或null。 o如果返回票证,请调用toString()方法在屏幕上打印票证。 o如果无人售票发出关于汽车(使用其toString()方法。 哦,让循环重复,直到有可用的输入文件中没有更多的数据。打印标识信息


这里是我的迄今为止,尽管我没有接近完成任务。

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

ParkingOfficer类:

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

} 
+0

还是有某种形式的计数器可与的FileReader类中使用?或者我应该创建一个? – lovinbayb4e

+0

你可以发布你的尝试,以便我们可以帮助你扩展它。 –

+0

请将此标记为家庭作业。目前尚不清楚何时首次发布。 – duffymo

回答

0

的基本结构是这样的:

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. */ 
+0

我以为我理解这个概念,除了你的陈述混淆了我之外...为什么我现在要使用它,在这种情况下休息的结果是什么?我唯一真正使用break的地方是在一个switch语句中...... – lovinbayb4e

+0

@ lovinbayb4e:我假设你正在使用'BufferedReader'类,以便你可以使用它的'readLine()'方法。如果是这样,在文件末尾,'readLine()'将返回'null'。在循环内部,我正在测试这种情况。因此,在每个循环(我猜测代表一个记录)开始时,测试一下是否有另一条记录。如果有,请继续阅读;否则,将循环中断。 break语句是在文件末尾循环的终止语句。 – erickson

+0

这就是我的想法,但问题是该文件的长度为42行...我想使用以7,6次块读取的行。 – lovinbayb4e

3
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. 为什么七行?你在跟他们做什么?他们是否真的以一种更好地表达为目标的方式相关?你可能没有用最好的方式来思考问题。
+0

这是一个大学作业......我已经创建了3个班级:ParkedCar,ParkingMeter和ParkingOfficer;我正在制作第四张:ParkingTicket。他们都编译没有错误,但我必须阅读他给我们的文件的行,并在整个类中使用它们。该文件按顺序读取汽车品牌,型号,颜色和许可证,停车计时器ID,购买的分钟数以及汽车停放的时间。然后ParkingOfficer类会检查时间是否已过期。如果是,则给予票证,如果不是,则返回无效。我必须重复这6次。 – lovinbayb4e

+0

我会分开阅读文件从所有这些逻辑和处理。将文件读入适当的对象和数据结构,关闭文件,并对这些对象和数据结构进行操作。不要混在一起。它被称为“单一责任”:给一种方法或课程做一件事。 – duffymo

+0

所以你说我应该读一切..?但我不明白我该怎么做......我不想要42个不同的变量,我只想要7个,然后用接下来的7个替换这7个值......我不知道为什么我'抓住这个概念有很多困难......它可能很简单,我只是过度考虑这一切...... – lovinbayb4e

1

您可以使用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]); 
    } 
}