【问题标题】:Create a 2d array in a square shape创建一个正方形的二维数组
【发布时间】:2021-04-15 14:15:46
【问题描述】:

我必须创建一个如图所示的二维数组:

我正在尝试这样,但我不确定:

public static void main(String[] args) {
    String[][] zeile1 = {"- - - - - - -"};
    String[][] zeile2 = {"|           |"};
    String[][] zeile3 = {"|           |"};
    String[][] zeile4;
}

【问题讨论】:

    标签: java arrays string multidimensional-array ascii-art


    【解决方案1】:

    图案

    这里的模式是

    • 您必须在第一行和最后一行打印破折号"-"
    • 您必须在第一列和最后一列打印"|"
    • 对于此处的其他字段,我们仅打印空白空格 " ";

    解决方案

    • 所以你声明了一个二维数组

    String[][] grid = new String[5][5]; // chose your dimension
    
    • 通过两个维度初始化您的网格循环,并检查 模式 部分中提到的 3 种情况。
      注意 i 对应于您的行和j 对应于您的列 这意味着i=0 是您的第一行,grid.length-1 是您的最后一行 这同样适用于列。

    if (i == 0 || i == grid.length - 1) {
        grid[i][j] = "-";
    } else if (j == 0 || j == grid[i].length - 1) {
        grid[i][j] = "|";
    } else {
        grid[i][j] = " ";
    }
    

    代码

    public static void main(String[] args) {
        String[][] grid = new String[5][5];
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (i == 0 || i == grid.length - 1) {
                    grid[i][j] = "-";
                } else if (j == 0 || j == grid[i].length - 1) {
                    grid[i][j] = "|";
                } else {
                    grid[i][j] = " ";
                }
            }
        }
    }
    

    输出

    -----
    |   |
    |   |
    |   |
    -----
    

    【讨论】:

      【解决方案2】:

      如果我正确理解了这个问题,我会提出这个解决方案:

      • 从概念上讲,您需要两个函数:
      • 一个初始化地板和天花板---------------
      static void initialiseCeilingAndFloor(char plane[][], int n) {
          for (int i = 0; i < plane.length; i++) {
              plane[0][i] = '-'; // ceiling is initialised
              plane[plane.length - 1][i] = '-'; //floor is initialised
          }
      }
      

      另一个在每面墙上画一条线|. . . . . . . . .|。 为了清楚起见,我实际上将这个方法一分为二:InitialiseInternalRow 执行它所说的,InitialiseBody 用它来初始化整个飞机体

      static void initialiseBody(char plane[][]) {
          // we already initialised floor and ceiling, so here we'll
          for (int i = 1; i < plane.length - 1; i++) {
              // reduce the cycle at the internal lines
              initialiseInternalRow(plane, i);
          }
      }
      
      static void initialiseInternalRow(char plane[][], int i) {
          for (int j = 0; j < plane.length; j++) {
              // if we are at the extremes, we draw a wall: '|'
              if (j == 0 || j == plane.length - 1)
                  plane[i][j] = '|';
              else // otherwise we leave space
                  plane[i][j] = ' ';
          }
      }
      

      这样您就可以轻松地在main 中初始化您的数组:

      char plane[][] = new char[n][n];
      initialiseCeilingAndFloor(plane);
      initialiseBody(plane);
      

      您甚至可以考虑将这两种方法包装在一起,一键初始化事物,如下所示:

      static void initialisePlane(char plane[][]) {
          initialiseCeilingAndFloor(plane);
          initialiseBody(plane);
      }
      

      这样你就可以轻松地从你的 main 调用:

      char plane[][] = new char[n][n];
      initialisePlane(plane);
      

      如果您的终端更多地将输出显示为矩形,请不要担心。这取决于您用于显示文本的特定应用程序所使用的格式。只需用点替换空格,然后计算它们。 在这里进行严格的测试。

      【讨论】:

        【解决方案3】:

        您可以使用流来创建这样的数组:

        int m = 5;
        String[][] arr = IntStream.range(0, m)
                .mapToObj(i -> IntStream.range(0, m)
                        .mapToObj(j -> {
                            String val = " ";
                            if (i == 0 || i == m - 1) {
                                val += "-";
                            } else if (j == 0 || j == m - 1) {
                                val += "|";
                            } else {
                                val += " ";
                            }
                            return val;
                        }).toArray(String[]::new))
                .toArray(String[][]::new);
        
        // output
        Arrays.stream(arr).map(row -> String.join("", row)).forEach(System.out::println);
        

        输出:

         - - - - -
         |       |
         |       |
         |       |
         - - - - -
        

        另见:
        How do I return such an multi-dimensional array?
        Drawing a rectangle with asterisks using methods and loops

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-16
          • 2020-04-21
          • 1970-01-01
          • 2016-12-27
          • 2014-05-05
          • 2016-04-23
          相关资源
          最近更新 更多