给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();// 输入完一行后要换行 } } }
总结:只要认真分析,就会发现第一种方法的理解和使用范围比第二种方法好多了,并且第二种方法的数学规律不好找啊。