【问题标题】:How to make a "border" of 1s around matrix of 10 by 10 0s in a Java matrix (2d array)如何在Java矩阵(二维数组)中围绕10乘10 0的矩阵制作1的“边界”
【发布时间】:2020-01-15 20:50:48
【问题描述】:

我是 java 新手,所以,请回答清楚直接的答案。我做了一个 12 x 12 的 0 矩阵。

000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000

我想用 1s 的“栅栏”围住中间区域。

111111111111
100000000001
100000000001
100000000001
100000000001
100000000001
100000000001
100000000001
100000000001
100000000001
100000000001
111111111111

我真的是 Java 新手,所以我只知道如何制作 12 x 12 并打印它,但现在如何制作栅栏。我还想知道如何使用循环在 10 x 10 的 0 网格内随机生成 10 个随机 1。请帮忙!!!!这是我的代码:

class Main {
 public static void main(String[] args){
 int[][] gameboard = new int[12][12];// make gameboard
 int r_length = gameboard.length;//row length
 int c_length = gameboard[0].length;//column length
 for (int x = 0; x < gameboard.length; x++) {
   for(int y = 0; y < gameboard.length; y++){
     gameboard[x][y] = x + y;
     gameboard[0][y] = gameboard[1]; //replace row 1 (not working)
     gameboard[11][y] = gameboard[1]; //replace row 12 (not working)
     gameboard[x][0] = gameboard[1]; //replace column 1 (not working)
     gameboard[x][11] = gameboard[1]; //replace column 12 (not working)
    }
  }

 for (int[] a : gameboard) {
   for (int x :a) {
     System.out.print("0");
    }
   System.out.println();
  }//gameboard printing
 }
}

【问题讨论】:

    标签: java arrays algorithm for-loop matrix


    【解决方案1】:
    public static void main(String[] args) {
        char border = '1';
        char fillCharaters = '0';
        int gridLength = 12;
        int gridWidth = 12;
        char[][] arr = new char[12][12];
        Random random = new Random();
    
        for (int j=0; j<gridWidth ; j++){
            for (int i=0;i<gridLength;i++){
                if(j==0||j==gridWidth-1||i==0||i==gridLength-1){
                    arr[j][i] = border;
                } else {
                    arr[j][i] = fillCharaters;
                }
            }
            //To print the random characters in the 10X10 grid
            int r = random.nextInt(11);
            arr[j][r] = border;
        }
        print2DMatrix(arr);
    }
    
    public static void print2DMatrix(char mat[][]) 
    { 
        for (int i = 0; i < mat.length; i++) 
        {
            for (int j = 0; j < mat[i].length; j++){
                if(j==mat[i].length-1){
                    System.out.println(mat[i][j]);
                } else{
                    System.out.print(mat[i][j]);
                }
            }       
        }    
    } 
    

    【讨论】:

      【解决方案2】:

      我在这里有一个稍微不同的建议:不要将边框放入您的数据中。

      如果你想明天有“*”而不是那些 1 怎么办?!然后你就坏了,因为你有一个int数组,而不是chars?!

      含义:您实际上应该将您的数据打印格式分开。

      当然,这会使打印变得更复杂(或不,请参见下文),但您的方法确实会产生很多丑陋的后果。例如:如果你想在某个时候将该矩阵传递给一些“计算”代码怎么办?然后,该计算代码将必须知道您的“边界”在该数据中的位置/方式,以将其排除在计算之外。或者当您决定将“文本控制台”程序变成 GUI 应用程序时?然后你可能真的会一条边界线......但你会继续携带包含那些“边界线”字符(双关语)的矩阵。

      那么,何不去:

      printTopLine();
      for (int[] rows : gameboard) {
        printRow(row);
      

      在哪里

      public void printTopLine() {
         ...println("1111...
      }
      

      public void printRow(int[] values) {
         print("1");
         for (int v : values) print(v);
         print("1");
      }
      

      如您所见:这实际上非常简单,当您决定:我想以不同的方式打印内容时,您只需进入并更改有必要的内容,而无需担心其中的数据 你的二维数组!

      所以,长话短说:您可以更改您的代码,以便您的 2D 矩阵关于您的游戏板的值,以及如何“显示”完全由 其他代码!

      【讨论】:

      • 为澄清起见,您希望我制作一个 10 x 10 2d 矩阵,然后按照您的慷慨代码制作边框以保持边框和矩阵分开。另外,在您的“where”代码中,... 是什么?此外,如何在新制作的 10 x 10 2d 矩阵中随机生成 10 个 1?
      • @UserX 如:这里确实有很多问题,比如stackoverflow.com/questions/25768435/… ...。只需将“java数组随机数”放入您喜欢的搜索引擎”
      • 鬼猫,报错“return type required”是什么意思?
      • @UserX 表示你定义了一个方法,漏掉了一个返回类型。当您查看我的示例时,您会看到它说“无效”。这意味着:不会返回任何东西。
      【解决方案3】:

      这里有几件事:

      1. 内部循环应该遍历内部长度:

        for(int y = 0; y < gameboard[0].length; y++)
        

        代替:

        for(int y = 0; y < gameboard.length; y++)
        
      2. 您不能将数组分配给int,类型必须匹配。

        gameboard[0][y] = gameboard[1];
        
      3. 这不会如你所愿:gameboard[x][y] = x + y;。它分配一个总和。

      因为它是一个正方形(两个长度相等),你可以迭代一次:

      for (int x = 0; x < gameboard.length; x++) {
           gameboard[0][x] = 1;
           gameboard[11][x] = 1;
           gameboard[x][0] = 1;
           gameboard[x][11] = 1;
      }
      

      在此之前,您在 gameboard.length 次做同样的工作。

      你也应该正确打印它:

       for (int[] a : gameboard) {
         for (int x :a) {
           System.out.print(x);
          }
         System.out.println();
        }
      

      【讨论】:

      • 为什么 x 的 y 轴位置? (最后代码的第 2 行)
      • 代码不起作用。我刚得到一个 12 x 12 的 0。感谢您的尝试!
      • 不是x索引,只是两个维度的索引
      • @UserX 也许你得到了 0,因为你只打印 0...查看我的编辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 2013-05-23
      • 2013-11-30
      • 1970-01-01
      • 2021-08-14
      • 2021-12-26
      相关资源
      最近更新 更多