黑马程序员技术交流社区

标题: 一个感觉很屌的小循环,看了半天也没看懂,有哪位大神可以简化一点........ [打印本页]

作者: xiguapi    时间: 2016-9-2 22:16
标题: 一个感觉很屌的小循环,看了半天也没看懂,有哪位大神可以简化一点........
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。

package com.itheima;


public class Test9 {
  public static void main(String[] args){
   //定义数组的长度
   
    int len = 10;
   
    //调用得到螺旋数组的方法
   
   int[][] arys = getSpiralArray(len);
   
    //用for循环嵌套,对数组进行遍历输出
   
    for (int i = 0; i < len; i++)
     {
      for (int j = 0; j < len; j++)
      {  
   
       System.out.print(arys[i][j] + "\t");
      }
        System.out.println();
    }
  }

public static int[][] getSpiralArray(int length) {
  //定义一个等长度的数组
  
  int[][] array = new int[length][length];
  
  int upcol = 0;
  
  //向右走列数
  
  int leftRow = 0;
  
  //记录最后一行的变量
  
  int downCol = length-1;
  
  //记录最后一列的变量
  
  int rightRow = length-1;
  
  int num = 1;
  while(length > 0){
   
   //向右走,循环遍历,并把得到的值添加到数组中
   
   for(int i = 0, temp = leftRow; i < length; i++){
   
    //第一行,打印向右走,随着列数的的自增1,第一行的元素也随着自增1
   
    array[upcol][temp++] = num++;      
   }     
   //向下走,循环遍历,并把得到的值添加到数组中
   
   for(int i = 0, temp =  leftRow+1; i < length-1; i++){
   
    //最后一列,打印向下走,随着行数的自增1,最后一列的元素也自增1
   
    array[temp++][downCol] = num++;
   }
   
   //向左走 ,循环遍历,并把得到的值添加到数组中,是从length-1列的最后一个元素开始,所以是rightRow-1
   
   for(int i = 0, temp = rightRow-1; i < length-1; i++){
   
    //最后一行,打印向左走,随着列数的自减1,最底层的元素自增1
   
    array[downCol][temp--] = num++;
   }   
   //向上走,循环遍历,并把得到的值添加到数组中  ,是从length-1行的最后一个元素开始,所以是downCol-1
   
   for(int i = 0, temp =downCol-1; i< length-2; i++){
   
    //最左边一列,向上打印,随着行数的自减1,最左边的一列中的元素自增1
   
    array[temp--][upcol] = num++;
   }
   //再往里边依次循环,直到打印到最后的一个数就是length的平方
   
   //每打印最外面的一圈,内圈的长度减少2
   
   length = length - 2;
   
   //向右走的行数增加1,也就是说第二轮循环是从第二行、第二列、length-1行、length-1列
   upcol++;
   leftRow++;
   downCol--;
   rightRow--;
  }  
  return array;
}  

}
作者: xiguapi    时间: 2016-9-2 22:17
看的好乱,看不懂......
作者: 584444948    时间: 2016-9-2 22:24
我表示也看不懂
作者: markiyangliu    时间: 2016-9-2 23:04
好乱 ,表示不想看,不过我也是很差,应该不会。不过有个建议:稍微搞工整一点,大神也会愿意看点。
作者: YaoDoctor    时间: 2016-9-3 18:15
真的不好看,好乱
作者: 岳阳天    时间: 2016-9-8 23:51

        private static void method(int[][] arr) {
                int i = 0;
                int j = 0;
               
                int max = arr.length -1;
                int min = 0;
               
                int num = 1;
                while(min<=max){
                        while(j<max){
                                arr[i][j++] = num++;
                        }
                        while(i<max){
                                arr[i++][j] = num++;
                        }
                        while (j>min){
                                arr[i][j--] = num++;
                        }
                        while (i>min){
                                arr[i--][j] = num++;
                        }
                        if(min ==max){
                                arr[i][j]= num;
                        }
                        max --;
                        min ++;
                       
                        j++;
                        i++;
                }
        }






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2