二维数组是个很有意思的数组,在Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同,在动态初始化的时候,可以指定最高维的行。
int a[][]=new int[5][];
通过一些习题,我们来看看二维数组的一些应用。
多维数组的行和列求平均值
--------------------------------------------
80 75 92
61 65 71
59 63 70
85 87 90
76 77 85
第一个方框表示行,第二个表示列,通过这一道题可以让你清楚二维数组是怎样在运转的。
求多维数组对角线之和
--------------------------------------------
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来减一个递增数就好了。
以下我用了两种方式来实现,只是角度不同罢了。
求多维数组中的每一行及每一列及全部最大数
--------------------------------------------
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
这一道题如果只是单纯让大家求行的最大数,我相信很快就能出来,关键在于列
其实二维数组有趣也就有趣在这个地方,通过控制行与列的循环的一个交换,就可以很容易的现实。
输出《杨辉三解形》....
-----------------------
1
1 1
1 2 1
1 3 3 1
[color=red]1[/color] [color=red]4[/color] 6 4 1
1 [color=red]5[/color] 10 10 5 1
关于杨辉三角形,这也算是一个经典的题目了
1.第一步先把一个三解形打出来。
2.把腰的部分打成1,通过观察,1往往出现在当下标为0或者上限值的时候。
3.下一行的一个数,往往是上一行正上方和左边的一个数,用红字标明,可以看得更清楚一些。
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
[color=red]1[/color] [color=red]4[/color] 6 4 1
1 [color=red]5[/color] 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();
}
}