繁体   English   中英

如何从数组列表中删除特定元素

[英]How to delete specific element from array list

我正在尝试,但它并不好。 这是所有代码:

    //creating passener object

    Passenger passenger1 = new Passenger(1, "Stefan", "Jankovic", "stefan@gmail.com", 3000);
    Passenger passenger2 = new Passenger(2, "Stefan", "Jankovic", "stefan@gmail.com", 3000);
    Passenger passenger3 = new Passenger(3, "Stefan", "Jankovic", "stefan@gmail.com", 3000);
    Passenger passenger4 = new Passenger(4, "Stefan", "Jankovic", "stefan@gmail.com", 3000);

将该乘客添加到数组列表中:

ArrayList<Passenger> passengerArrayList = new ArrayList<>();
    passengerArrayList.add(passenger1);
    passengerArrayList.add(passenger2);
    passengerArrayList.add(passenger3);
    passengerArrayList.add(passenger4);

我试图从数组中删除特定的乘客,如下所示:

@Override
public void deletePassenger(ArrayList<Passenger> passengerList) {

    System.out.println("---Passengers list--");
    for (Passenger tempPassenger : passengerList) {
        System.out.println(tempPassenger);
        System.out.println("If you want to see options menu, enter 6");
    }

    System.out.println("Enter ID of passenger that you want to delete!");
    int id = scanner.nextInt();
    scanner.nextLine();

    System.out.println("---Passengers list--");
    for (Passenger tempPassenger : passengerList) {
        System.out.println(tempPassenger);
        passengerList.remove(id);
    }


}

这是错误:

    ---Passengers list--
Passenger{id=1, firstName='Stefan', lastName='Jankovic', email='stefan@gmail.com', balance=3000.0}
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.remove(ArrayList.java:492)
    at com.cv.controllers.PassengerControllerImpl.deletePassenger(PassengerControllerImpl.java:394)
    at com.cv.demo.Main.main(Main.java:66)

您现在遇到的问题是您只是根据用户输入从列表的索引中删除一个元素,而您应该确保列表具有该大小。 第二件事,您不能在通过 forEach 循环浏览列表时从列表中删除一个元素,您会得到一个ConcurrentModificationException ,读取concurrentModificationException 这样做的方法是使用迭代器,检查

Iterator<Passenger> itr = passengerList.iterator();
while (itr.hasNext()){
    Passenger p = itr.next();
    if (id == p.getId()) {
        itr.remove();
        break;
    }
}

如果您想使用您的乘客 ID 从 ArrayList 中删除乘客,您可以创建自己的删除 function。

public void removeList(ArrayList<Passenger> passengerList, int passengerId) {
    for (int i = 0; i<passengerList.size(); i++) {
        if (passengerList.get(i).getId() == passengerId) {
            passengerList.remove(i);
        }
    }
}

你可以这样使用

@Override
public void deletePassenger(ArrayList<Passenger> passengerList) {

    System.out.println("---Passengers list--");
    for (Passenger tempPassenger : passengerList) {
        System.out.println(tempPassenger);
        System.out.println("If you want to see options menu, enter 6");
    }

    System.out.println("Enter ID of passenger that you want to delete!");
    int id = scanner.nextInt();
    scanner.nextLine();

    System.out.println("---Passengers list--");
    removeList(passengerList, id);


}

您的代码假设id和列表索引之间存在相关性。 不!

代码失败,因为id是从 1 开始的,并且列表索引值是从 0 开始的,所以最后一位Passenger的 id 为 4,但在索引 3 处。索引 4 处没有 object,因此出现异常。

您必须迭代列表并比较id值。 有2种方式:

  • 使用removeIf(filter) (Java 8+)

     boolean removed = passengerList.removeIf(p -> p.getId() == id); if (: removed) throw new IllegalArgumentException("Passenger not found; " + id);
  • 使用Iterator (所有 Java 版本)

     boolean removed = false; Iterator<Passenger> iter = passengerList.iterator(); while (iter.hasNext()) { Passenger p = iter.next(); if (p.getId() == id) { iter.remove(); removed = true; break; // Stop searching. Remove this if there can be more than one } } if (: removed) throw new IllegalArgumentException("Passenger not found; " + id);

更新:以上代码已更新为此评论的后续内容:

如果不存在的用户输入 ID 显示一些消息,如何添加 if 语句?

似乎它应该从 arraylist 中删除该特定乘客。 id 和 index 不相关。 删除后尝试检查您的列表:

for (Passenger tempPassenger : passengerList) {
       if(tempPassenger.id==id){
              passengerList.remove(tempPassenger);
       }
         
    }
       
    

for (Passenger tempPassenger : passengerList) {
        System.out.println(tempPassenger);
    }

暂无
暂无

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

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