如何检查2D对象数组是否包含某个对象? (JAVA)

时间:2018-06-11 21:14:48

标签: java arrays class object inheritance

public class Maze {
    private static final int Max_Maze_Row=20;
    private static final int Max_Maze_Column=50;
    public static Entity[][] maze =new Entity[Max_Maze_Row][Max_Maze_Column];


    public Maze(){

    }

    public static void create(String filename) throws FileNotFoundException{
        Scanner fileinput=new Scanner(new FileInputStream(filename));
        fileinput.useDelimiter("");

        while(fileinput.hasNextLine()){
            for(int row=0;row<Max_Maze_Row;row++){
                String line_content=fileinput.nextLine();
                for(int col=0;col<Max_Maze_Column;col++){
                    if(line_content.charAt(col)=='*'){
                        maze[row][col]=new Wall('*',row,col);
                    }
                    if(line_content.charAt(col)==' '){
                        maze[row][col]=new Space(' ',row,col);
                    }
                }    
            }
        }
}
public abstract class Entity {
    protected char symbol;
    protected int row;
    protected int col;

    Entity(char symbol, int row, int col){
        this.symbol=symbol;
        this.row=row;
        this.col=col;
    }

    public abstract void create();

    public char Entity_put(char newEntity, int newRow, int newCol){
        char oldEntity=this.symbol;
        this.symbol=newEntity;
        this.row=newRow;
        this.col=newCol;
        System.out.println(oldEntity);
        return oldEntity;
    }

}
public class Wall extends Entity{
    public Wall(char symbol,int row,int col){
        super(symbol,row,col);
    }
    public void create(){

    }

}

我还有一个继承自Entity超类的类Space。它本质上是&#39; &#39 ;.所以会发生什么,程序从文本文件中读取,然后创建具有特定行,列,字符值的墙和空间实体。这些实体存储在Entity [] []迷宫中。 但是,我该如何引用这些对象? 例如,我怎么知道迷宫阵列中有多少墙对象? 基本上,我想要做的是: 随机选择不是墙的实体(即空间实体)。 做点什么。

2 个答案:

答案 0 :(得分:0)

您可以使用索引引用多维数组中的对象,然后您可以使用instanceof来识别它们是Wall还是Space .....您可以编写如下所示的内容。下面是一个计算Walls数量的代码&#39;和空间&#39;在你的迷宫多维数组中。

public static void count(Maze[][] maze) {
    int wallCount = 0;

    int spaceCount = 0;

    if (maze != null)

        for (int i = 0; i < maze.length; i++) {

            if (maze[i] != null)
                for (int j = 0; j < maze[i].length; j++) {

                    if (maze[i][j] instanceof Wall)
                        wallCount++;
                    if (maze[i][j] instanceof Space)
                        spaceCount++;
                }

        }

}

答案 1 :(得分:0)

编辑: 我认为你可以在performAction类中使用另一个抽象函数,例如Entity,并在每个子类中重写此方法,在本例中为WallSpace。稍后遍历数组时,您可以执行

Entity entity = maze[row][col];
entity.performAction();

Java将确定在运行时使用哪个子类performAction

=============================================== ============================ 一种选择是将另外两个ArrayList存储为字段。例如,

List<Entity> walls;
List<Entity> spaces;

在构造函数中初始化它们。

public Maze() {
    this.walls = new ArrayList<Entity>();
    this.spaces = new ArrayList<Entity>();
}

Maze.create()中最内层的循环内,您可以使用这些循环来跟踪墙和空间。

for(int col = 0; col < Max_Maze_Column; col++){
    if (line_content.charAt(col) == '*') {
        maze[row][col] = new Wall('*', row, col);
        this.walls.add(maze[row][col]);
    } 

    if (line_content.charAt(col) == ' ') {
        maze[row][col] = new Space(' ', row, col);
        this.spaces.add(maze[row][col]);
    }
}

您可以通过索引访问获得每个墙和空间。如需尺寸,请致电walls.size()spaces.size()。对于随机访问,您可以使用

// int max = walls.size() or spaces.size()
Random seed = new Random();
// Generate a random integer from 0 to (max - 1)
int index = seed.nextInt(max);

第二个选项可能是在稍后遍历数组时使用instanceof运算符。例如,

Entity entity = maze[row][col];

if (entity instanceof Wall) {
    Wall wall = (Wall) entity;
    // do something with wall

} else if (entity instanceof Space) {
    Space space = (Space) entity;
    // do something with space
}