java实现螺旋数组-另类方法

         给java的螺旋数组赋值的时候,网上查了一下都是找到数据之间的规律,然后,通过规律给数据的元素赋值,后来,请教了同事,同事给我提供了另一种方法,个人感觉挺不错的,就分享了:(这是逆时针螺旋数据)

         该种方法不仅可以解决n*n型的2维数组,也可以解决m*n型的螺旋数组的赋值。

         代码如下:

        

/**
 * 逆时针螺旋数组
 * @author Administrator
 *
 */
public class LoopAndRecursionACW2 {
	private int[][] numArray;
	int x=0;
	int y=0;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		LoopAndRecursionACW2 loopACW = new LoopAndRecursionACW2();
		loopACW.createArray();
		loopACW.printToConsole();
	}
	private void createArray() {
		int i=0,j=0;//数组下标
		int c=0;//层数,从0开始,每一层都是一个正方形(或长方形),总共有四条边,每一个边的角上,就是拐点
		int d=0;//0,表示第一条边,1,表示第二条边,2,表示第三条,3,表示第四条
		String s = JOptionPane.showInputDialog("请输入行列数,逗号隔开");
		String[] a = s.split(",");
		x = Integer.parseInt(a[0]);
		y = Integer.parseInt(a[1]);
		numArray = new int[x][y];
	    int maxValue = x*y;
	    
	    for(int k=1;k<=maxValue;k++){
	    	if(d==0){
	    		if(i==x-c-1){//第一个拐点
	    			d=1;
	    		}else{
	    			numArray[i][j]=k;
	    			i++;
	    			continue;
	    		}
	    	}
	    	if(d==1){
	    		if(j==y-c-1){//第二个拐点
	    			d=2;
	    		}else{
	    			numArray[i][j]=k;
	    			j++;
	    			continue;
	    		}
	    	}
	    	if(d==2){
	    		if(i==c){//第三个拐点
	    			d=3;
	    		}else{
	    			numArray[i][j]=k;
	    			i--;
	    			continue;
	    		}
	    	}
	    	if(d==3){
	    		if(j==c+1){//第四个拐点的处理比较特殊
	    			numArray[i][j]=k;
	    			d=0;
	    			c++;
	    			i++;
	    			continue;
	    		}else{
	    			numArray[i][j]=k;
	    			j--;
	    			continue;
	    		}
	    	}  	
	    }
		
	}
	
	private void printToConsole() {
		String space = "";
		for(int i=0;i<x;i++){
			for(int j=0;j<y;j++){
				if(numArray[i][j]<10){
					space="  ";
				}else{
					space=" ";
				}
				System.out.print(numArray[i][j]+space);
			}
			System.out.println();//换行
		}
		
	}


}

以下是网上常见的方法,该方法只能实现n*n维的螺旋数组的赋值,代码如下:

/**
 * 逆时针实现螺旋数组
 * ACW-AntiClockWise
 * @author Administrator
 *
 */
public class LoopAndRecursionACW {

	int[][] numArray;
	int record = 1;// 记录每层的起始数字
	int stepF = 0;// 每层的起始下标
	int stepE = 0;// 每层的终止下标
	int reduce = 0;// 用于记录减小量

	public static void main(String args[]) {

		new LoopAndRecursionACW().process();

	}

	public void setNum(int num) {// 递归的为二维数组赋值
		if (num > 0) {// 只要层数是正数继续赋值

			for (int i = stepF; i < stepE; i++) {// 为每层的第一列和最后一列赋值
				numArray[i][stepF] = record;
				numArray[i][stepE - 1] = record + 3 * (num - 1) - 2 * reduce;
				reduce++;
				record++;
			}
			reduce = 1;
			for (int i = stepF + 1; i < stepE - 1; i++) {// 为每层的第一行和最后一行赋值
				numArray[stepE - 1][i] = record;
				numArray[stepF][i] = record + 3 * (num - 1) - 2 * reduce;
				reduce++;
				record++;
			}
			reduce = 0;
			stepF++;
			record = record + 2 * (num - 1);// 得到下一层的起始量
			stepE--;
			setNum(num - 2);// 每递归一次每层边上的数字量减小2
		} else
			// 当边数含有的数字量非正时退出递归
			return;
	}

	public void process() {// 将数组中的数字按行列的形式输出
		String s = JOptionPane.showInputDialog("输入矩阵");
		int num = Integer.parseInt(s);
		numArray = new int[num][num];
		String space = "";
		stepE = num;//每层的终止下标
		setNum(num);
		for (int i = 0; i < num; i++) {
			for (int j = 0; j < num; j++) {
				if (numArray[i][j] < 10 && j > 0) {// 保证输出是个正方形,不会因为是一位数或者2位数影响效果
					space = "  ";
				} else
					space = " ";
				System.out.print(numArray[i][j] + space);
			}
			System.out.println();// 输入完一行后要换行
		}
	}

}

总结:只要认真分析,就会发现第一种方法的理解和使用范围比第二种方法好多了,并且第二种方法的数学规律不好找啊。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值