首页 > 解决方案 > 如何检查二维对象数组是否包含某个对象?(爪哇)

问题描述

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。它本质上是''。所以发生的事情是,程序从文本文件中读取,然后创建墙和空间实体,它们具有特定的行、列、字符值。这些实体存储在 Entity[][] 迷宫中。但是,如何引用这些对象?例如,我如何知道迷宫阵列中有多少墙壁对象?基本上,我正在尝试做的事情是:随机选择一个不是墙的实体(即空间实体)。做一点事。

标签: javaarraysclassobjectinheritance

解决方案


编辑:我认为您可以在类中拥有另一个抽象函数performAction,并Entity在每个子类中覆盖此方法,即在这种情况下。当您稍后遍历数组时,您可以这样做WallSpace

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

performActionJava 将确定在运行时使用哪个子类。

==================================================== ========================= 一种选择是将另外两个存储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()and 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
}

推荐阅读