如何通过传入String参数而非对象本身从ArrayList中移除指定ParkingSlot对象
实现方案说明
你不需要将完整的ParkingSlot对象转换为String进行匹配,只需要对比每个对象的spotID属性即可,有两种合规且易维护的实现方案可选,同时你现有代码的equals方法存在缺陷需要先修复。
现有问题修正
你当前ParkingSlot类的equals方法没有做类型校验,当传入非ParkingSlot类型的对象时会抛出ClassCastException,且没有同步重写hashCode方法,违反Java对象相等性规范,修正后的代码如下:
package assignment1; import java.util.Objects; public class ParkingSlot { private String spotID; public ParkingSlot(String spotID) { this.spotID = spotID; } public String getParkingSlot(){ return spotID; } @Override public String toString() { return spotID ; } @Override public boolean equals(Object obj) { // 先判断引用相等、空值、类型是否匹配 if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; ParkingSlot that = (ParkingSlot) obj; return Objects.equals(spotID, that.spotID); } @Override public int hashCode() { return Objects.hash(spotID); } }
实现传String移除车位的两种方案
方案1:重载removeSlot方法,直接遍历匹配(推荐)
用Java 8+提供的removeIf方法可以一行代码实现,逻辑直观不依赖equals的实现:
public void removeSlot(String spotId) { // 遍历集合,移除ID匹配的车位 slots.removeIf(slot -> slot.getParkingSlot().equals(spotId)); }
如果使用Java 8以下版本,用迭代器实现:
public void removeSlot(String spotId) { Iterator<ParkingSlot> iterator = slots.iterator(); while (iterator.hasNext()) { ParkingSlot slot = iterator.next(); if (slot.getParkingSlot().equals(spotId)) { iterator.remove(); break; // 车位ID唯一的情况下,找到后可直接终止遍历 } } }
方案2:构造临时ParkingSlot对象调用原有remove方法
因为你已经重写了equals方法,只要spotID相等就会被判定为相同对象,因此可以直接构造临时对象传入remove:
public void removeSlot(String spotId) { slots.remove(new ParkingSlot(spotId)); }
该方案代码更简洁,但依赖equals方法的正确性,且如果ParkingSlot构造方法存在额外逻辑会产生不必要的开销,适合业务逻辑简单的场景。
内容的提问来源于stack exchange,提问作者Nishant0823
相关产品推荐
相关产品推荐

