无法使用 .contains 方法来检测船舶是否漂浮

Having trouble getting the .contains method to detect whether or not a ship is afloat

我想使用 .contains 方法检查我的 ArrayList 中是否有沉没的船只。 5 艘船中有 2 艘本应沉没,但我的代码一直将所有 5 艘船都带回沉没。

我以为我可以用一个简单的

if(fleetList.contains(data.isAfloat()) == false)

是否有我缺少的方法或东西?即使经过几次 google 搜索和重新阅读文本,我也无法弄清楚。

public class ShipTest {
    public static void main(String[] args) {
        System.out.println("ARRAY OF SHIPS IN MAIN");
        Ship cs1 = new CruiseShip("Caribbean", 2700, true, 1998, "Magic");
        Ship cs2 = new CruiseShip("Atlantic Ocean", 1300, false, 1912, "Titanic");
        
        Ship cgs1 = new CargoShip("containers", 391, false, 1974, "El Faro");
        
        CargoShip cgs2 = new CargoShip("crude oil", 564763, false, 1979, "Seawise Giant");
        
        Ship ws1 = new WarShip("super carrier", "United States Navy", true, 1972, "USS Nimitz");
        
        Ship[] fleet = {cs1, cs2, cgs1, cgs2, ws1};
        for (int i = 0; i < fleet.length; i++)
        {
            System.out.println(fleet[i]);
        }
        
        List<Ship> fleetList = new ArrayList<Ship>();
        Collections.addAll(fleetList, fleet);
        
        shipShow(fleetList);
    }
    
    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(fleetList.contains(data.isAfloat()) == true)
            {
                sunk += 1;
            }
        }
        System.out.println(sunk + " of these ships sank!");
    }
}
int sunk = 0;
for (Ship data : fleetList) {
    System.out.println(data);
    if(fleetList.contains(data.isAfloat()) == true)
    {
        sunk += 1;
    }
}
System.out.println(sunk + " of these ships sank!"); 

可以替换为以下代码段

  Predicate<Ship> aFloatShipFilter = (Ship s) -> s.isAfloat();
    
    List<Ship> afloatShipList = fleetList.stream().filter(aFloatShipFilter).collect(Collectors.toList());
    
    System.out.println(afloatShipList.size() + " of these ships sank!");

如果你有一张你喜欢的画的清单,我问你:嘿,呃,清单上有鸡蛋吗,你可能会回答“搞什么?这是画的清单,不是杂货店列表。

但是也有一个技术性的答案:不,'eggs'(显然)不在这个绘画列表中。

这正是 java 的工作原理。不,data.isAfloat(),这是一个布尔值(truefalse),显然不在舰船列表中,不。

您已经在轮船中循环 (for (Ship data : fleetList))。无需进一步参考该循环的 fleetList inside

你想要的只是if (data.isAfloat())。 (也不需要 == truedata.isAfloat() 已经 returns 一个布尔值,它已经 returns true 或 false)。

fleetList.remove(2) 从列表中删除索引为 2 的单个元素。这是集装箱船,因为 Java Lists 使用基于零的索引。它不会从列表中删除两个元素。

您可以在 Ship class 实例中设置一个标志来指示沉没,而不是从 fleetList 中删除沉没的船只。我的 shipShow 方法版本是执行此操作的一种方法。

public static void shipShow (List<Ship> fleetList)
{
    System.out.println ("ARRAY LIST OF SHIPS FROM METHOD");
    // Remove this: fleetList.remove (2);
    fleetList.get (2).setFloating (false);
    final Ship ws2 = new WarShip ("attack submarine", "United States Navy", true, 2015, "USS John Warner");
    fleetList.add (ws2);
    int sunk = 0;
    for (final Ship data : fleetList)
    {
        System.out.println (data);
        if (!data.isAfloat ())
        {
            sunk += 1;
        }
    }
    System.out.println (sunk + " of these ships sank!");
}

飞船 class 看起来像这样:

class Ship
{
    private boolean floating = true;

    public Ship (String typeName, int tonnage, boolean b, int date, String shipName)
    {
    }

    public void setFloating (boolean flag)
    {
        floating = flag;
    }

    public boolean isAfloat ()
    {
        return floating;
    }
}

您还需要 WarShip、CruiseShip 和 CargoShip 的子classes。