【问题标题】:How to call an 2D - Array which was initiated in another class?如何调用在另一个类中启动的二维数组?
【发布时间】:2022-08-12 19:01:04
【问题描述】:

我为我的问题做了一个最小的简化示例:Maze 类使用方法generateMaze() 创建了一个二维布尔数组(mazeArray 的内容在此示例中无关紧要)。来自Walker 的主线程调用该方法,从而从Maze 类创建这个mazeArray

我不明白如何在Walker.walk 中调用这个数组?恐怕我有知识差距。

每一个提示都非常感谢,非常感谢。

public final class Maze {

public static boolean[][] generateMaze(int width, int height) {

    boolean[][] mazeArray = new boolean[width][height];

    for( int x = 0; x < width; x++ ) {
        mazeArray[x][0] = true;
    }
    for( int y = 0; y < height; y++ ) {
        mazeArray[0][y] = true;
    }
    return mazeArray;
}

}

public class Walker {

public static void main(String[] args) {
    Maze mazeObj  = new Maze();
    boolean[][] maze = Maze.generateMaze(2,2);
}

public void walk(Maze maze) {
   // Traverse Array
}

}
  • 你缺乏 OOP 的基础知识,我建议你退后一步,先看看一些教程。就个人而言,我可以推荐这个免费课程:java-programming.mooc.fi

标签: java multidimensional-array boolean method-call


【解决方案1】:

解释

有几个基本面向对象这里的错误。

首先,当您的generateMaze 类是static 并将迷宫作为boolean[][] 的实例而不是Maze 返回时,为什么还要创建Maze 类的实例。您可能打算将数组作为类的字段,而不是直接访问数组,而是通过迷宫实例。

接下来,walk 方法是非静态的,是Walker 实例的一部分。因此,您需要创建该类的一个实例并在该实例上调用该方法。


迷宫生成

您可能打算这样做:

public final class Maze {
  // Arrays as field of maze instances
  private boolean[][] mazeArray;

  // return maze instance instead of array
  public static Maze generateMaze(int width, int height) {
    // create maze instance
    Maze maze = new Maze();
    // manipulate array of that maze instance
    maze.mazeArray = new boolean[width][height];

    for (int x = 0; x < width; x++) {
        maze.mazeArray[x][0] = true;
    }
    for (int y = 0; y < height; y++) {
        maze.mazeArray[0][y] = true;
    }

    // return the maze, not its array
    return maze;
  }
}

打个电话

Maze maze = Maze.generateMaze(2, 2);

构造函数

或者更好的是,使用构造函数:

public final class Maze {
  private final boolean[][] mazeArray;

  public Maze(int width, int height) {
    mazeArray = new boolean[width][height];

    for (int x = 0; x < width; x++) {
        mazeArray[x][0] = true;
    }
    for (int y = 0; y < height; y++) {
        mazeArray[0][y] = true;
    }
  }
}

在你的main 中这样称呼它:

Maze maze = new Maze(2, 2);

工厂

如果你真的想要,你仍然可以将它与工厂方法结合起来。但是创建逻辑应该在(可能是private)构造函数中:

public final class Maze {
  private final boolean[][] mazeArray;

  private Maze(int width, int height) {
    mazeArray = new boolean[width][height];

    for (int x = 0; x < width; x++) {
        mazeArray[x][0] = true;
    }
    for (int y = 0; y < height; y++) {
        mazeArray[0][y] = true;
    }
  }

  public static Maze generate(int width, int height) {
    return new Maze(width, height);
  }
}

像这样称呼它:

Maze maze = Maze.generate(2, 2);

沃克

现在,您需要一个 Walker 类的实例并在其上调用方法,给它您刚刚生成的迷宫:

Maze maze = new Maze(2, 2);
Walker walker = new Walker();

walker.walk(maze);

【讨论】:

  • 很有帮助,非常感谢。这是一种设计模式技术,不是吗?
  • 别客气。我不确定它是否有专用名称。对我来说,这只是关于 OOP 的一些基础知识。构造函数,静态的,非静态的,方法和工厂方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 2013-07-18
  • 2018-04-22
  • 1970-01-01
  • 2012-04-10
  • 2017-10-16
相关资源
最近更新 更多