试图删除数组中的值

时间:2011-12-05 02:54:07

标签: java

我遇到的问题是没有从数组中删除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对象添加没有正确存储在数组中?我是阵列的新手,有点迷失我做错了什么。任何帮助,将不胜感激。谢谢!

6 个答案:

答案 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  ....
        }    
  }