如何在java中使arraylist保持一致

如何在java中使arraylist保持一致,java,arraylist,Java,Arraylist,如何使java中的ArrayList保持一致。意味着当我在一个函数中更新ArrayList时,它将被更新。但是,退出该函数后,它再次将其大小设置为0 public static ArrayList<Vehicle> al=new ArrayList<Vehicle>(); java.util.Iterator<Vehicle> itr= al.iterator(); @SuppressWarnings("unchecked") pub

如何使java中的ArrayList保持一致。意味着当我在一个函数中更新ArrayList时,它将被更新。但是,退出该函数后,它再次将其大小设置为0

public static ArrayList<Vehicle> al=new ArrayList<Vehicle>();
    java.util.Iterator<Vehicle> itr= al.iterator();

    @SuppressWarnings("unchecked")
    public boolean addVehicleToSlot(Vehicle vehicle) {
        if((vehicle.slotNo<=0||vehicle.slotNo>40)&&(vehicle.getVehicleType()!="Car"
                ||vehicle.getVehicleType()!="Truck"||vehicle.getVehicleType()!="Two Wheeler")){
            new InvalidSlotException("Slot alraedy allotted");
            return false;
        }
        int iter=0;
        int len=al.size();
        if(len==0){
            al.add(vehicle);
            return true;
        }
        while(iter< len){
            Vehicle veh=(Vehicle)itr.next();
            if(veh.getSlotNo()==vehicle.getSlotNo()){
                new SlotNotFoundException("No slot allotted");
                return false;
            }
            else{
                al.add(vehicle);
                for(Vehicle vehi:al){
                    System.out.println(al);
                }
                return true;
            }
        }
        return false;
    }

请帮我解决这个问题。

您正在初始化类时创建迭代器。此时,al可能为空。留下一个空迭代器。因为您永远不会更新迭代器。您永远不会迭代列表,因此:列表保持为空

因此,用增强的for循环代替iter。另外,您似乎想要抛出异常,但实际上从未抛出它们。最后,您将字符串与==进行比较,但这通常不起作用,因为==不会检查字符串是否相等,而是检查引用。对于两个看起来相等的字符串,这可能并不总是正确的。改为使用.equals:


您需要考虑的错误和问题很多:

我认为您不了解迭代器是如何工作的。它们通常是非常短期的变量:declare、iterate、dispose。对于持久迭代器有一些用例,但这不是其中之一。 事实上,现在通常不需要显式迭代器:在大多数情况下,可以使用for-each或Stream。 您的逻辑似乎暗示列表中只能有一辆具有给定“槽”的车辆。如果是这样的话,有更好的处理方法: 使用地图存储插槽:

Map<Integer,Vehicle> slotMap;

请不要使用。另外:寻求调试帮助的问题此代码为什么不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。这不是完整的代码。确保arraylist的作用域大于这个函数,如果你想看到更新,你不需要这里的迭代器,我认为,如果你只是想让addVehicleToSlot方法简单地将一辆车添加到列表中,这里的循环没有明显的价值。只需将车辆存储在地图或列表中,车辆将插入其插槽索引,甚至车辆[],然后您可以直接查找是否已分配插槽。我可以想象您打算在循环后添加车辆。否则,它不会在第一次迭代时抛出或返回很远的循环。@AndyTurner事实上,我不确定OP想要用它实现什么。整个循环没有真正意义。如果数组是空的,那么迭代器将永远不会被使用,所以它是空的不是问题。@JoakimDanielson是的,但是在第一次插入之后,仍然不会发生迭代。因为itr仍然是一个空迭代器。让人觉得名单是空的,这是一个公平的观点。我们真的不知道何时在什么范围内初始化,但也许你是对的。
public boolean addVehicleToSlot(Vehicle vehicle) {
    if((vehicle.slotNo <=0 || vehicle.slotNo > 40) && (!vehicle.getVehicleType().equals("Car") || !vehicle.getVehicleType().equals("Truck") || !vehicle.getVehicleType().equals("Two Wheeler"))){
        throw new InvalidSlotException("Slot alraedy allotted");
    }

    if(al.isEmpty()){ // instead of al.size() == 0, just use al.isEmpty()
        al.add(vehicle);
        return true;
    }

    for(Vehicle veh : al){
        if(veh.getSlotNo() == vehicle.getSlotNo()){
            throw new SlotNotFoundException("No slot allotted");
        } else{
            al.add(vehicle);
            return true;
        }
    }
    return false;
}
Map<Integer,Vehicle> slotMap;
if (al.stream().anyMatch(v -> v.getSlotNr() == vehicle.getSlotNr()))
    ...