`
show213
  • 浏览: 6590 次
社区版块
存档分类
最新评论

二维数组

    博客分类:
  • Java
 
阅读更多
二维数组是个很有意思的数组,在Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同,在动态初始化的时候,可以指定最高维的行。
int a[][]=new int[5][];

通过一些习题,我们来看看二维数组的一些应用。

多维数组的行和列求平均值
--------------------------------------------
80  75  92
61  65  71
59  63  70
85  87  90
76  77  85
第一个方框表示行,第二个表示列,通过这一道题可以让你清楚二维数组是怎样在运转的。
public void Avg(){
		int num[][] = {
			{80,75,92}, // 二维数组的初值赋值
			{61,65,71},
			{59,63,70},
			{85,87,90},
			{76,77,85}
			};
		int m=0; int p=0;		
		//此题的一个关键知识点在于,num.length可以用来表示行数和num[i].length可以用来表示列数,
		//求行的平均值,最外层的循环控制行 num.length为5
		for(int i=0;i<num.length;i++){			
			//内层循环控制列,num[i]的长度为3
			for(int j=0;j<num[i].length;j++){				
				m+=num[i][j];				
			}
			m=m/num[i].length;
			System.out.println(m+" ");				
		}	
		//求列的平均数,所以列数在最外层控制循环
		int index=0;
		for(int j=0;j<num[index].length;j++){			
			//内层循环为行循环
			for(int i=0;i<num.length;i++){				
				p+=num[i][j];				
			}
			p=p/num.length;
			System.out.print(p+" ");		
			index++;
		}		
	}





求多维数组对角线之和
--------------------------------------------
4    2    3   
4    5    6   
7    8    9 

这道题有个很有趣的地方值得大家注意,关于对角线我们该怎么求。如果我问你在这九个数里把对角线用笔画连起来,我相信只要是智力正常的人都可以不费吹灰之力就可以马上完成。
但计算机不知道啊,你要告诉它,通过观察你可以发现一个问题,那就是4,5,9的行和列下标都是一样的,也就是00,11,22,所以在循环里加个判断就可以了。但3,5,7的下标就不是一眼可以看得出来,它们的下标分别为02,11,00,从这三个下标可以看出J这个数递增的很有规律,而i 出来的数列是010,那如果只是单纯的输出这样的数列,用2来减一个递增数就好了。
以下我用了两种方式来实现,只是角度不同罢了。

public void diagonal(){
		int s=0;
		int p=0;
		int num[][] = {
				{4,2,3}, // 二维数组的初值赋值
				{4,5,6},
				{7,8,9}};
		
		//此循环遍历最外层,行
		for(int i=0;i<num.length;i++){
			
			for(int j=0;j<num[i].length;j++){
				
				if(i==j){	
					
					s+=num[i][j]+num[2-i][j];
				}		
				System.out.print(num[i][j]+" ");
			}	
			System.out.println(s);
			
		}
		//从右下角到左上角,反向对角线		
		for(int i=num.length-1;i>=0;i--){
			
			for(int j=num[i].length-1;j>=0;j--){
				
				if(i==j){					
					p+=num[i][j]+num[2-i][j];
				
				}		
				System.out.print(num[i][j]+" ");
				
			}	
			System.out.println("p:"+p);
			
		}		
	}



求多维数组中的每一行及每一列及全部最大数
--------------------------------------------
16 24 77 32 41
69 45 83 12 89
37 66 18 35 56
22 33 44 55 66
19 28 37 46 55

这一道题如果只是单纯让大家求行的最大数,我相信很快就能出来,关键在于列
其实二维数组有趣也就有趣在这个地方,通过控制行与列的循环的一个交换,就可以很容易的现实。

public void Max(){
		
		int num[][] = {
				{16,24,77,32,41}, // 二维数组的初值赋值
				{69,45,83,12,89},
				{37,66,18,35,56},
				{22,33,44,55,66},
				{19,28,37,46,55}};		
		//求行的最大数
		for(int i=0;i<num.length;i++){
			int s=0;
			for(int j=0;j<num[i].length;j++){				
				if(num[i][j]>s){					
					s=num[i][j];	
				}		
				System.out.print(num[i][j]+" ");
			}	
			System.out.println("最大值:"+s);			
		}
		System.out.println();
		//int j=0;j<num[j].length;j++如果这样写,那么到第5次循环的时候,那num[j]的下标会越界,所以需要在循环体内加判断,在j=4的时候,跳出去。
		for(int j=0;j<num[j].length;j++){			
			int s=0;
			for(int i=0;i<num.length;i++){				
				if(num[i][j]>s){					
					s=num[i][j];	
				}		
				System.out.print(num[i][j]+" ");
			}	
			System.out.println("最大值:"+s);			
				
				if(j==num[j].length-1){
					
					break;
				}	
		}		
	}






输出《杨辉三解形》....
-----------------------

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
关于杨辉三角形,这也算是一个经典的题目了
1.第一步先把一个三解形打出来。
2.把腰的部分打成1,通过观察,1往往出现在当下标为0或者上限值的时候。
3.下一行的一个数,往往是上一行正上方和左边的一个数,用红字标明,可以看得更清楚一些。


public void YangHui(int len){
		int [][]num=new int[len][len];		
		//行不变
		for(int i=0;i<num.length;i++){
			//列在递增,因为j的值是控制列的,故应该对J
			for(int j=0;j<i;j++){				
				if(i==0||j==0||j==i){					
					num[i][j]=1;					
				}else{					
					num[i][j]=num[i-1][j]+num[i-1][j-1];
				}
				
				System.out.print(num[i][j]+" ");
				
			}	
			System.out.println();
		}	
		
	}




0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics