比方说,我有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中删除汽车?
答案 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
上覆盖hashCode
和name
方法,然后使用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]
为此,您的班级必须根据汽车的名称覆盖equals
和hashCode
。