繁体   English   中英

在添加之前检查ArrayList中元素的ID是否已经存在

[英]Checking if the ID of an element in an ArrayList is already there before adding it

我是Java的初学者,我想创建一个小型的Parking System系统。 该系统有四个类别,一个用于用户输入,一个具有ArrayList,用于维护“停车”中的插槽列表,一个“ ParkingSlot”和“一辆汽车”。

目前,我正在努力寻找如何将用户输入的插槽ID与ArrayLis中现有的插槽ID进行比较的方法。 目前,如果用户输入现有值,它只会覆盖它。

我在addParkingSLot方法中添加了条件“ if(!slots.contains(newId))”,但它似乎不起作用。

Application类中负责用户ID输入的部分:

choice = scanner.nextInt();
scanner.nextLine();
if (choice == 1) {
    System.out.println("Enter an ID of the type \"D##\"");
    input = scanner.nextLine();
    if(input.matches("[D][0-9][0-9]")) {
        System.out.println("Nice");
        carParkObj.addParkingSlot(input, "Visitor", false);                                                                             
    }
    else {
        System.out.println("Invalid Input");
    }
    break;

停车场课程:

public class CarPark {

    private ArrayList<ParkingSlot> slots;       

    public CarPark() {
        slots = new ArrayList<ParkingSlot>();

    }
    /**
     * storing Parking Slot 
     */

    public void addParkingSlot(String newId, String newType, boolean newOccupied)
    {
        ParkingSlot slotObj = new ParkingSlot(newId, newType, newOccupied);
        if (!slots.contains(newId)) {
            slots.add(slotObj);
        }
        else {
            System.out.println("This slot ID already exists");
        }
    }

当用户输入现有值时,它将被添加到arrayList中,而不是收到有关插槽ID已存在的消息。

您的ArrayList类型为ParkingSlot ,但是您正在使用.contains的类型为String 无论如何它返回false 您可以添加新的方法来检查公园中是否有特定编号的汽车:

public boolean hasParkingSlot(String searching) {
  for(ParkingSlot slot : slots) {
    if(slot.getID().equals(searching)) return true;
  }
  return false;
}

我希望这有帮助 :)

您的slots ArrayList包含ParkingSlot对象,而不是String对象,因此您实际上在寻找的是字符串形式的停车位,并且没有这样的东西(俗称“比较苹果和橘子”)。

用老式的方式,你可以写

boolean found = false;
for (ParkingSlot slot : slots) {
    if (slot.id.equals(newId)) {
        found = true;
        break;
    }
}

if (found) …

(我假设ParkingSlot有一个名为id的可访问字段,但是您没有显示停车位的定义。尽管如此,即使它不是我编写的方式,您也可以看到它的意图。)

如用户Vega TV的另一个答案所建议,将代码包装为单独的方法是一个好主意。

有更多简洁的方法可以编写此代码,但我建议采用这种方法,因为我认为以较小的步骤对初学者有所帮助。

一种更简洁的方法是使用流设施:

boolean found = slots.stream().anyMatch(slot -> slot.id.equals(newId));

我没有实际尝试输入,所以请记住这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM