我遇到的问题是没有从数组中删除Vehicle对象(我不确定它是否存储正确。)
用户必须首先将Vehicle对象添加到数组中。然后它将它们带回菜单,询问是否要添加另一个,或删除车辆。
此类中的方法接受选择(1或2)以将Vehicle添加到数组,或从数组中删除车辆:
private void validate(int choice, File file) throws FileNotFoundException
{
Vehicle[] vehicle = new Vehicle[4];
switch(choice)
{
case 1:
store = new Store(file);
store.addVehicle(vehicle);
run();
break;
case 2:
store = new Store();
if(store.deleteVehicle(vehicle) == false)
{
System.out.println("Vehicle not deleted");
}
run();
break;
}
假设用户想要添加车辆。它被传递给Store类: 我在Store类中的声明:
Vehicle[] vehicles = new Vehicle[4];
Store类中的addVehicle方法:
public void addVehicle(Vehicle vehicle[]) throws FileNotFoundException
{
boolean found = false;
if(canAddVehicle())
{
for(int i = 0; i < vehicles.length || !found; i++)
{
if(vehicles[i] == null)
{
Scanner reader = new Scanner(file);
vehicle[i] = new Vehicle();
vehicle[i].readRecord(reader);
found = true;
reader.close();
}
}
System.out.println("Vehicle Added!");
}
else
{
System.out.println("You can not add more than 4 vehicles.");
}
System.out.println(vehicle[0].getVIN());
}
我添加了底部的最后一行来测试它是否在我调用readRecord()时将变量存储在Vehicles类中。 (它显示正确。)
现在它将回到发布的第一个方法,让我们说用户想删除一个Vehicle。它被传递给Store类方法(deleteVehicle(vehicle)):
public boolean deleteVehicle(Vehicle vehicle[])
{
System.out.println(vehicle[0].getVIN());
Scanner input = new Scanner(System.in);
String VIN = null;
System.out.println("Please enter the VIN of the vehicle you want to delete:");
VIN = input.next();
for(int i = 0; i < vehicles.length; i++)
{
if(vehicle[i] != null)
{
if(vehicle[i].getVIN().equals(VIN))
{
vehicle[i] = null;
return true;
}
}
}
return false;
}
我在顶部添加了该行,以查看车辆阵列的插槽0中是否还有VIN的值...事实证明我得到了NullPointerException错误...所以它似乎是第一个Vehicle对象添加没有正确存储在数组中?我是阵列的新手,有点迷失我做错了什么。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:4)
case 2:
store = new Store();
if(store.deleteVehicle(vehicle) == false)
{
System.out.println("Vehicle not deleted");
}
run();
break;
由于您每次都将store设置为new Store(),因此这是Store类的全新实例,因此无需删除任何内容。
答案 1 :(得分:1)
在我看来,问题可能根本不是您的数组逻辑,而是您在每次调用validate方法时使用不同的“store”对象这一事实。
答案 2 :(得分:0)
从数组中删除元素有点困难。您可以使用System.arraycopy方法将一些元素从源数组移动/复制到目标数组。但是,我建议使用ArrayList<T>
而不是数组。
答案 3 :(得分:0)
Arrays存储对象的引用。您可以根据需要修改这些对象(甚至可以将它们“标记”为已删除,但您对数组中包含的对象所做的任何操作都不会影响数组本身。此外,您不能只是添加或删除项目一个数组 - 所有你能做的就是替换它们。(所以你可以将给定的数组位置设置为null
- 但是你必须记住要经常检查它。)
如果确实需要在数组中添加或删除元素,则需要将数组重新创建为适当的大小,然后复制其余元素。 Java API提供了内置方法来帮助完成许多这些操作。或者,使用Collection - 例如ArrayList
。
答案 4 :(得分:0)
Tyr使用ArrayList和
ArrayList<Vehicle> vehicleList=new ArrayList<Vehicle>();
//Add vehicle
vehicleList.add(new Vehicle());
vehicleList.remove(index);
使用此功能,您可以在列表中添加任何元素。
答案 5 :(得分:0)
这里的设计相当可怕。存储中的许多功能应该在车辆中,并且商店应该包含一系列的veichles,它不应该传递到商店。基本设计是这样的:
class Vehicle {
public Vehicle(/*parameters*/)
static Vehicle readVehicle();
public boolean equals(Vehicle other);
// a ton of things to deal with vehicle data.
}
class Store {
//an array of vehicles, or an arrayList of vehicles.
public void addVehicle(Vehicle v);
public boolean removeVehicle(Vehicle v);
}
现在您的数据结构更有意义,我们可以继续讨论实际算法应该是什么。我假设您只想要一个商店,可能会在其他地方初始化,但会在您阅读和删除更多车辆时进行修改。
validate()
对于名称来说是一个令人困惑的选择,因为您没有验证输入,实际上您正在更改数据。在psudeocode中,我认为你想要这样的东西:
Store s = new Store(file);
int choice;
while((choice=getChoice())!=CHOICE_QUIT)
runChoice(choice, s);
使用新的runChoice函数看起来像
void runChoice(int choice, Store store){
//perhaps this is not appropriate for all choices?
//Where would you move it if not?
Vehicle v = Vehicle.readVehicle();
switch(choice){
//i think you know what to do ....
}
}