Как проверить, содержит ли массив 2D-объектов определенный объект?(Джава) - PullRequest
0 голосов
/ 12 июня 2018
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(){

    }

}

У меня также есть класс Space, который наследуется от суперкласса Entity.Это по сути ".Итак, что происходит, программа читает из текстового файла, а затем создает настенные и пространственные объекты, которые имеют определенную строку, столбец, символьное значение.И эти объекты хранятся в лабиринте Entity [] [].Тем не менее, как я могу ссылаться на эти объекты?Например, как я могу узнать, сколько объектов стены есть в массиве лабиринта?По сути, я пытаюсь сделать что-то вроде: Случайно выбрать объект, который не является стеной (то есть космический объект).Сделай что-нибудь.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Edit: я думаю, что вы можете иметь другую абстрактную функцию, такую ​​как performAction в Entity классе, и переопределить этот метод в каждом подклассе, а именно Wall и Space в этом случае.Когда вы пройдете через массив позже, вы можете просто

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
}
0 голосов
/ 12 июня 2018

Вы можете ссылаться на объекты в многомерном массиве, используя их индекс, затем вы можете использовать instanceof, чтобы определить, являются ли они Wall или Space ..... вы можете написать что-то вроде ниже.Ниже приведен код для подсчета количества Стен и Пробелов в многомерном массиве Лабиринта.

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++;
                }

        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...