假设我有 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 中删除汽车?
最佳答案
使用Iterator迭代汽车
如果汽车的名称与给定的 name
匹配(即作为参数传递给方法的 name
),则使用迭代器变量删除汽车。
按如下方式进行:
public void removeCar(String name) {
Iterator<Car> car = cars.iterator();
while (car.hasNext()) {
if (car.next().name.equals(name)) {
car.remove();
}
}
}
另一个选项(我不推荐)是仅在 name
上覆盖 equals
和 hashCode
方法,然后使用 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
作为参数。
关于java - 在不知道索引的情况下从 ArrayList 中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62564141/