一些问题:
你在两个"if"测试中增加了j.我没有检查确定(这是相当复杂的代码,说实话)但如果你确定你只是在找到匹配时增加j,那将有所帮助.
您的测试i
基本上意味着它将尝试读取与文件中的行一样多的车辆,而不是在您到达文件末尾时停止.基本上你不需要i
这里.
这是一个改变版本:
while (j < autos.length) { if (vehicle.equalsIgnoreCase(autos[j])) { j++; Vehicle v = new Vehicle(); v.setOwnerName(autos[j++]); allVehicles.add(v); } else if(car.equalsIgnoreCase(autos[j])){ j++; Car c = new Car(); c.setOwnerName(autos[j++]); allVehicles.add(c); } }
虽然提取类型会稍微清晰一点 - 然后你可以单独进行比较:
while (j < autos.length) { String type = autos[j++]; if (vehicle.equalsIgnoreCase(type)) { Vehicle v = new Vehicle(); v.setOwnerName(autos[j++]); allVehicles.add(v); } else if(car.equalsIgnoreCase(type)){ Car c = new Car(); c.setOwnerName(autos[j++]); allVehicles.add(c); } }
它仍然不是我怎么做的,但它更接近......
我的下一步是更合适地使用扫描仪:
while (scanner.hasNext()) { String type = scanner.nextLine(); if (type.equalsIgnoreCase("vehicle")) { allVehicles.add(new Vehicle(scanner)); } else if (type.equalsIgnoreCase("car")) { allVehicles.add(new Car(scanner)); } // ... }
然后使Vehicle,Car等的构造函数直接从扫描程序进行解析.
下一步是将构造与迭代分开.介绍一种新方法:
// Use a base type in real code private static Object parseNextVehicle(Scanner scanner) { String type = scanner.nextLine(); if (type.equalsIgnoreCase("vehicle")) { return new Vehicle(scanner); } else if (type.equalsIgnoreCase("car")) { return new Car(scanner); } // ... throw an exception indicating an unknown vehicle type } // ... and then in the main method, use it like this: while (scanner.hasNextLine()) { allVehicles.add(parseNextVehicle(scanner)); }