Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试删除数组中的值_Java - Fatal编程技术网

Java 尝试删除数组中的值

Java 尝试删除数组中的值,java,Java,我遇到的问题是没有从数组中删除车辆对象(我不确定它是否正确存储) 用户必须首先将车辆对象添加到阵列中。然后,它会将他们带回菜单,询问他们是否要添加其他车辆或删除车辆 此类中的方法接受将车辆添加到数组或从数组中删除车辆的选项(1或2): private void validate(int choice, File file) throws FileNotFoundException { Vehicle[] vehicle = new Vehicle[4]; switch(choi

我遇到的问题是没有从数组中删除车辆对象(我不确定它是否正确存储)

用户必须首先将车辆对象添加到阵列中。然后,它会将他们带回菜单,询问他们是否要添加其他车辆或删除车辆

此类中的方法接受将车辆添加到数组或从数组中删除车辆的选项(1或2):

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];
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());
}
Store类中的addVehicle方法:

Vehicle[] vehicles = new Vehicle[4];
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());
}
public void addVehicle(Vehicle-Vehicle[])抛出FileNotFoundException
{
布尔值=false;
如果(canAddVehicle())
{
对于(int i=0;i
我在底部添加了最后一行,以测试它是否在Vehicles类中存储了我调用readRecord()时的变量。(它显示正确。)

现在它将返回到发布的第一个方法,假设用户想要删除车辆。它被传递到存储类方法(deleteVehicle(vehicle)):

公共车辆(车辆[])
{
System.out.println(车辆[0].getVIN());
扫描仪输入=新扫描仪(System.in);
字符串VIN=null;
System.out.println(“请输入要删除的车辆的VIN:”;
VIN=输入。下一步();
对于(int i=0;i

我在顶部添加了这一行,以查看车辆阵列的插槽0中是否仍有VIN值。。。结果是我得到了一个NullPointerException错误。。。因此,似乎添加的第一个车辆对象未正确存储在阵列中?我刚接触阵列,对自己做错了什么有些茫然。任何帮助都将不胜感激。谢谢

从数组中删除元素有点困难。可以使用System.arraycopy方法将某些元素从源阵列移动/复制到目标阵列。但是,我建议使用
ArrayList
而不是数组。

从数组中删除元素有点困难。可以使用System.arraycopy方法将某些元素从源阵列移动/复制到目标阵列。但是,我建议使用
ArrayList
而不是数组。

数组存储对对象的引用。您可以随意修改这些对象(甚至可以将它们“标记”为已删除,但对数组中包含的对象所做的任何操作都不会影响数组本身。此外,您不能仅从数组中添加或删除项,您所能做的就是替换它们。(因此,您可以将给定的数组位置设置为
null
——但您必须记住始终要检查该位置。)


如果确实需要从数组中添加或删除元素,则需要将数组重新创建为适当的大小,然后复制其余元素。Java API中有内置的方法可以帮助执行这些操作。或者,使用集合,例如
ArrayList

数组存储对objec的引用ts.您可以随意修改这些对象(甚至可能将它们“标记”为已删除,但您对数组中包含的对象所做的任何操作都不会影响数组本身。此外,您不能仅从数组中添加或删除项,您所能做的就是替换它们。(因此,您可以将给定的数组位置设置为
null
——但您必须记住始终要检查该位置。)


如果确实需要从数组中添加或删除元素,则需要将数组重新创建为适当的大小,然后复制其余元素。Java API中有内置的方法可以帮助执行这些操作。或者,使用集合,例如
数组列表

,在我看来,问题在于可能根本不是您的数组逻辑,而是您在每次调用validate方法时使用不同的“存储”对象。

在我看来,问题可能根本不是您的数组逻辑,而是您在每次调用validate方法时使用不同的“存储”对象

case 2:
    store = new Store();

    if(store.deleteVehicle(vehicle) == false)
    {
        System.out.println("Vehicle not deleted");
    }
    run();
    break;
由于您每次都将store设置为new store(),因此这是store类的一个新实例,因此不需要删除任何内容


由于每次都将store设置为new store(),因此这是store类的一个新实例,因此不需要删除任何内容。

Tyr使用ArrayList和

 ArrayList<Vehicle> vehicleList=new ArrayList<Vehicle>();
 //Add vehicle
 vehicleList.add(new Vehicle());
 vehicleList.remove(index);
ArrayList vehicleList=新建ArrayList();
//添加车辆
车辆列表。添加(新车());
车辆列表。删除(索引);

使用此选项,列表中可以有任意数量的元素。

Tyr使用ArrayList和

 ArrayList<Vehicle> vehicleList=new ArrayList<Vehicle>();
 //Add vehicle
 vehicleList.add(new Vehicle());
 vehicleList.remove(index);
ArrayList vehicleList=新建ArrayList();
//添加车辆
车辆列表。添加(新车());
车辆列表。删除(索引);

使用此功能,您的列表中可以有任意数量的元素。

此处的设计相当可怕。商店中的许多功能应在车辆中,商店应包含一系列面纱,而不应传递给商店。基本设计如下:

 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);
 }
  Store s = new Store(file);
  int choice;
  while((choice=getChoice())!=CHOICE_QUIT)
      runChoice(choice, s);
现在您的数据结构变得更有意义了,我们可以继续讨论实际的算法应该是什么