无法使用 .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()
,这是一个布尔值(true
或false
),显然不在舰船列表中,不。
您已经在轮船中循环 (for (Ship data : fleetList)
)。无需进一步参考该循环的 fleetList
inside。
你想要的只是if (data.isAfloat())
。 (也不需要 == true
。data.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。
我想使用 .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()
,这是一个布尔值(true
或false
),显然不在舰船列表中,不。
您已经在轮船中循环 (for (Ship data : fleetList)
)。无需进一步参考该循环的 fleetList
inside。
你想要的只是if (data.isAfloat())
。 (也不需要 == true
。data.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。