在不知道索引的情况下从ArrayList中删除对象

时间:2020-06-24 21:10:57

标签: java

比方说,我有10辆汽车的ArrayList,我想从列表中删除索引为6的汽车。如果我现有的代码为:

public class Main {

    public static void main(String[] args) {
        
        Car C1 = new Car();
        C1.addCar("audi", 5);
        C1.addCar("porsche", 3);

        C1.removeCar("audi"); // is not working
        
}

public class Car {

    private String name;
    private int age;

    private ArrayList<Car> cars;

    public Car() {
        this.cars = new ArrayList<>();
    }

    public Car(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void addCar(String name, int age) {
        this.cars.add(new Car(name, age));
    }

    public void removeCar(String name) {
        this.cars.remove(name);
    }

      public ArrayList<Car> getCars() {
        return cars;
    }
}

如何更改删除方法以能够按名称从ArrayList中删除汽车?

2 个答案:

答案 0 :(得分:1)

使用Iterator迭代cars,如果汽车的名称与给定的name相匹配(即,将name作为参数传递给方法)。

执行以下操作:

public void removeCar(String name) {
    Iterator<Car> car = cars.iterator();
    while (car.hasNext()) {
        if (car.next().name.equals(name)) {
            car.remove();
        }
    }
}

另一种选择(我不建议)是仅在equals上覆盖hashCodename方法,然后使用List#contains,如下所示:

class Car {

    private String name;
    private int age;

    private ArrayList<Car> cars;

    public Car() {
        this.cars = new ArrayList<>();
    }

    public Car(String name) {
        this.name = name;
    }

    public Car(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void addCar(String name, int age) {
        this.cars.add(new Car(name, age));
    }

    public void removeCar(String name) {
        Car car = new Car(name);
        if (cars.contains(car)) {
            cars.remove(car);
        }
    }

    public ArrayList<Car> getCars() {
        return cars;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    @Override
    public boolean equals(Object obj) {
        Car other = (Car) obj;
        return Objects.equals(name, other.name);
    }
}

请注意,这种方法还需要为承包商提供name作为参数。

答案 1 :(得分:1)

如果要从数组列表中删除对象,只需指定对象即可。它将删除它涉及的第一个。还是我误会了你想做什么?

ArrayList<String> list = new ArrayList<>();
        
list.add("A");
list.add("B");
list.add("C");
list.add("D");
        
System.out.println(list);
list.remove("C");
System.out.println(list);
        

打印

[A, B, C, D]
[A, B, D]

为此,您的班级必须根据汽车的名称覆盖equalshashCode