Java中ArrayList的contains方法无法正确判断船舶是否沉没问题
问题根因分析
- 核心错误是对
ArrayList.contains()方法的使用逻辑完全错误:你的fleetList是存储Ship对象的列表,而data.isAfloat()返回的是boolean类型的布尔值,两种完全不同类型的对象不可能匹配,所以contains()方法永远会返回false。 - 你原本的判断逻辑
if(fleetList.contains(data.isAfloat()) == false)就会永远成立,导致每遍历一艘船就给沉没数+1,最终统计出全部5艘都沉没的错误结果。 - 额外的逻辑错误:你根本不需要调用
contains方法来判断当前船舶是否沉没,直接取当前遍历到的Ship实例的isAfloat()返回值判断即可:isAfloat()返回true代表船舶正在漂浮,返回false代表已经沉没。
修正后的代码
只需要修改shipShow方法里的循环判断逻辑即可:
public static void shipShow(List<Ship> fleetList ) { System.out.println("ARRAY LIST OF SHIPS FROM METHOD"); fleetList.remove(2); Ship ws2 = new WarShip("attack submarine", "United States Navy", true, 2015, "USS John Warner"); fleetList.add(ws2); int sunk = 0; for (Ship data : fleetList) { System.out.println(data); // 直接判断当前船是否未漂浮(即沉没) if(!data.isAfloat()) { sunk += 1; } } System.out.println(sunk + " of these ships sank!"); }
补充说明
如果你后续确实需要用contains方法做船舶存在性校验(比如判断某艘特定的船是否在列表中),需要你在Ship类中重写equals()和hashCode()方法,否则contains会默认比对对象的内存地址,而不是对象的属性值。
内容的提问来源于stack exchange,提问作者NextBoldHarpy
相关产品推荐
相关产品推荐

