Java 如何检查ArrayList是否包含来自其他类的对象
我有两个职业,一个是Java 如何检查ArrayList是否包含来自其他类的对象,java,arraylist,Java,Arraylist,我有两个职业,一个是战斗机职业,一个是玩家职业。Player类包含一个名为fleet的ArrayList,其中填充了玩家的飞船 我可以将战舰添加到玩家的舰队中而不会出现问题,但是当我尝试检查玩家舰队中是否有战斗机时,会出现一个错误,即战斗机无法解析为变量 我不明白为什么我可以在舰队中增加一架战斗机,但不能检查舰队中是否有战斗机 Fighter.java public class Fighter extends Ship { public Fighter(){ super(
战斗机
职业,一个是玩家
职业。Player
类包含一个名为fleet
的ArrayList
,其中填充了玩家的飞船
我可以将战舰添加到玩家的舰队中而不会出现问题,但是当我尝试检查玩家舰队中是否有战斗机时,会出现一个错误,即战斗机无法解析为变量
我不明白为什么我可以在舰队中增加一架战斗机,但不能检查舰队中是否有战斗机
Fighter.java
public class Fighter extends Ship {
public Fighter(){
super(9,1,1); //Sets attack and defense values
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class Player {
ArrayList<Ship> fleet = new ArrayList<Ship>();
public void takeAHit(){
if (fleet.contains(Fighter)){ //Error happens here
System.out.println("Fighter found");
}
}
public void buildFleet(){
Scanner userInput = new Scanner(System.in);
System.out.println("How many fighters?");
int fighters = Integer.parseInt(userInput.next());
while (fighters > 0){
fleet.add(new Fighter());
fighters--;
}
userInput.close();
}
}
public class Core {
public static void main(String[] args) {
Player p1 = new Player();
p1.buildFleet();
p1.takeAHit();
}
}
Player.java
public class Fighter extends Ship {
public Fighter(){
super(9,1,1); //Sets attack and defense values
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class Player {
ArrayList<Ship> fleet = new ArrayList<Ship>();
public void takeAHit(){
if (fleet.contains(Fighter)){ //Error happens here
System.out.println("Fighter found");
}
}
public void buildFleet(){
Scanner userInput = new Scanner(System.in);
System.out.println("How many fighters?");
int fighters = Integer.parseInt(userInput.next());
while (fighters > 0){
fleet.add(new Fighter());
fighters--;
}
userInput.close();
}
}
public class Core {
public static void main(String[] args) {
Player p1 = new Player();
p1.buildFleet();
p1.takeAHit();
}
}
不幸的是,包含
方法需要类的实例,而不是类本身。
要引用一个类,您需要将.class
附加到名称后面
我能想到的最佳解决方案是创建一个使用instanceof
关键字的方法,类似于:
public boolean isFighterInFleet() {
for(Ship ship : this.fleet)
if(ship instanceof Fighter)
return true;
return false;
}
然后使用:
if (isFighterInFleet()){
而不是
if (fleet.contains(Fighter)){
不幸的是,包含
方法需要类的实例,而不是类本身。
要引用一个类,您需要将.class
附加到名称后面
我能想到的最佳解决方案是创建一个使用instanceof
关键字的方法,类似于:
public boolean isFighterInFleet() {
for(Ship ship : this.fleet)
if(ship instanceof Fighter)
return true;
return false;
}
然后使用:
if (isFighterInFleet()){
而不是
if (fleet.contains(Fighter)){
在Java 8中:
this.fleet.stream().filter(ship->ship instanceof
.findFirst().isPresent()
在Java 8中:
this.fleet.stream().filter(ship->ship instanceof
.findFirst().isPresent()
如果你想检查一个类,你可以使用Fighter.class
,但我不确定这是否有效。它确实消除了错误,但在我运行程序时没有找到Fighter。你可能必须对每个方法使用,并检查每个entry.class==Fighter.class
,这是我能想到的唯一方法。其他人可能会有更好的选择你把buildFleet叫哪里?舰队似乎没有战斗机。啊,对不起,我没有包含Core.java文件。它只是在我的主要方法中运行。我已经在上面添加了我的Core.java。如果你想检查一个类,你可以使用Fighter.class
,但我不确定这是否有效。它确实消除了错误,但是当我运行程序时,它找不到战斗机。你可能必须对每个
方法使用,并检查每个entry.class==fighter.class
这是我能想到的唯一方法。其他人可能会有更好的选择你把buildFleet叫哪里?舰队似乎没有战斗机。啊,对不起,我没有包含Core.java文件。它只是在我的主要方法中运行。我已经在上面添加了我的Core.java。我相信应该是公共布尔值isFighterInFleet()
@TaylorLiss更改了。这个代码是否可以针对不同类型的船舶进行模块化?i、 e.我是否可以以某种方式传入我要检查的类的名称,并让它搜索该类型的船舶?您可以添加类型为class
的参数和if
语句useship.getClass().equals(参数)
。确保用实际的参数名替换参数
。哈哈,太棒了!完美的非常感谢你!我认为这应该是公共布尔值isFighterInFleet()
@TaylorLiss的改变,它是否有可能为不同类型的船舶将此代码模块化?i、 e.我是否可以以某种方式传入我要检查的类的名称,并让它搜索该类型的船舶?您可以添加类型为class
的参数和if
语句useship.getClass().equals(参数)
。确保用实际的参数名替换参数
。哈哈,太棒了!完美的非常感谢你!