17xie > Java语言实用教程 > 4.3 多维数组
背景:                 
[本书目录] [图书首页] [本书讨论区]  
链接地址:http://www.17xie.com/read-2617.html    注册17xie 一起来写书 实现您的出书梦想!

4.3  多维数组

Java语言中,多维数组被看作数组的数组,多维数组的定义是通过对一维数组的嵌套来实现的。

4.3.1  二维数组

多维数组中最常用的是二维数组。二维数组的声明方式与一维数组类似,内存的分配也是通过new运算符。

二维数组声明的语法格式为:

数据类型 数组名[][];      //声明二维数组

数组名=new 数据类型[行数][列数];      //分配内存给数组

与一维数组不同的是,二为数组在分配内存时,必须告诉编译器二维数组行与列的个数。

例如:

int a[][];      //声明整型二维数组a

a=new [2][3];      //分配内存给数组供23列的整型数组a使用

同样也可以在声明数组的同时给数组规定空间,将上面的两个语句合并为:

int a[][]=new int[2][3];

以上语句表示定义了23列的二维数组a,数组的每个元素为一个整数。数组中各元素通过其下标来区分,每个下标的最小值为0,最大值比行数或列数少1。数组a包括6个元素,分别是:a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2],相当于一个mn列的规则矩阵。

编译上面的语句后,内存的分配情况,如图4-4所示。

4-4  规则矩阵的二维数组内存分配

需要注意的是由于Java语言把多维数组看作是数组的数组,所以并不要求多维数组中的每一维数组的大小都相同,也就是说Java的多维数组不一定是规则的矩阵形式。例如:

int x[][];

x=new [3][];

这两句代码表示数组x3个元素,每个元素都是int类型的一维数组,相当于定义了3个数组变量,分别为:x[0][]x[1][]x[2][]。在这里可以把x[0]x[1]x[2]看作变量名,通过new运算符使其指向它们的数组对象,如:

x[0]=new int[3];

x[1]=new int[2];

由此可以看出,二维数组x的每行长度可以是不一样的。编译上面的语句后,内存的分配情况,如图4-5所示。

4-5  不规则矩阵的二维数组内存分配

若要取得二维数组的行数,只要在数组名后加上“.length”属性即可,若要得到数组中某行元素的个数,则需要在数组名后加上该行的下标,再加上“.length”,例如:

a.length;      //得到数组a的行数

a[0].length;      //得到数组a的第1行元素个数

4-5】为二维数组的每个元素赋值并求和。

//********** ep4_5.java **********

class ep4_5{

  public static void main(String args[]){

    int a[][];      //声明二维数组

    a=new int[5][10];

    int sum=0;

    for(int i=0;i<a.length;i++){

      for(int j=0;j<a[i].length;j++){

        a[i][j]=i*10+j;      //为数组每个元素赋值

        sum+=a[i][j];

      }

    }

    System.out.println("The sum is:"+sum);

  }

}

运行结果:

The sum is1225

同一维数组一样,在给二位数组创建空间时,若元素是基本类型,系统将按照默认规则赋初始值,如果元素类型为复合型,则所有元素为未赋值状态(null)。

二维数组也可以进行静态初始化,语法格式为:

数据类型 数组名[][]={{1行初值表},{2行初始值表},{……},{n+1行初始值表}};

例如:

int a[][]={{1,2,3},{4,5,6}};      //23列的数组

char spring[][]={{""},{"","",""}};      //13列的数组

需要注意的是同一维数组一样,在声明二维数组时不能指定其长度,否则会出现错误。如:int a[2][3]={{1,2,3},{4,5,6}};

4-6】计算并输出杨辉三角形。

//********** ep4_6.java **********

class ep4_6{

  public static void main(String args[]){

    int i,j,level=7;

    int Yang[][]=new int[level][];      //声明二维数组存放杨辉三角形

    System.out.println("杨辉三角形");

    for(i=0;i<Yang.length;i++){

      Yang[i]=new int[i+1];      //定义二维数组的第i行有i+1

    }

    Yang[0][0]=1;      //第一个元素为1

    for(i=1;i<Yang.length;i++){      //计算杨辉三角形

      Yang[i][0]=1;      //杨辉三角形左边都为1

      Yang[i][Yang[i].length-1]=1;      //杨辉三角形右边都为1

      for(j=1;j<Yang[i].length-1;j++){

        Yang[i][j]=Yang[i-1][j-1]+Yang[i-1][j];

      }

    }

    for(i=0;i<Yang.length;i++){      //输出杨辉三角形

      for(j=0;j<Yang[i].length;j++){

        System.out.print(Yang[i][j]+" ");

      }

    System.out.println();

    }

  }

}

运行结果如图4-6所示:

4-6  4-6的运行结果

4.3.2  三维以上的多维数组

了解了二维数组,就会发现弱项提高数组的维数,只需要在声明数组的时候将其下标与中括号增加即可,所以三维数组的声明为int a[][][],四维数组的声明为int a[][][][],依此类推。

使用多维数组时,输入、输出的方式和一维、二维相同,但是每多一维,嵌套循环的层数就会增加一层。所以数组的维数越高,数组的复杂程度也就越高。

4-7】创建一个3×4×5的三维数组,用其下标乘积生成每个元素,显示这些乘积。

//********** ep4_7.java **********

class ep4_7{

  public static void main(String args[]){

    int a[][][]=new int[3][4][5];

    int i,j,k;

    for(i=0;i<3;i++){

      for(j=0;j<4;j++){

        for(k=0;k<5;k++){

          a[i][j][k]=i*j*k;

          System.out.print(a[i][j][k]+" ");

        }

        System.out.println();

      }

      System.out.println();

    }

  }

}

运行结果如图4-7所示:

4-7  4-7的运行结果

练习题

4.1  数组对象的长度在数组对象创建之后,就______改变。数组元素的下标总是从______开始。

4.2  对于数组int[][]t={{1,2,3},{4,5,6}}来说,t.length等于______t[0].length等于______

4.3  已知数组a的定义为“int a[]={1,2,3,4,5};”,则a[2]=______,数组b的定义为“int b[]=new int[5];”,则b[2]=______,数组c的定义为“Object []c=new Object[5];”,则c[2]=______

4.4  调用数组元素时,用____________来唯一确定数组中的元素。

4.5  下列______语句有错误。

A. int []a;    B. int []b=new int[10];    C. int c[]=new int[];    D. int d[]=null;

4.6  下列______语句有错误。

A. int a[][]=new int[5][5];    B. int [][]b=new int[5][5];

C. int []c[]=new int[5][5];    D. int [][]d=new int[5,5];

4.7  关于下面的程序,正确的结论是______

public class ex4_7{

  public static void main(String args[]){

    int a[]=new int[5];

    boolean b[]=new boolean[5];

    System.out.print(a[1]);

    System.out.println(b[2]);

  }

}

A. 运行结果为0false    B. 运行结果为1true

C. 程序无法通过编译    D. 可以通过编译但结果不确定

4.8  书写一个声明99列数组的语句______

4.9  什么是数组?数组有哪些特点?Java中创建数组需要哪些步骤?如何访问数组的第一个元素?

4.10  编程计算10~20的整数的平方值,将结果保存在一个数组中。

4.11  编写一个程序使之从键盘读入10个整数存入整型数组a中,然后逆序输出这10个整数。

4.12  某人有53分和45分的邮票,请编写一个程序,计算由这些邮票中的1张或若干张可以得到多少种不同的邮资。

 

 


字数:6079    最后更新:1年以前 [10-11 17:33]屈辰晨 修改
本页编辑者:屈辰晨  
[前一页]:第4章 数组  [后一页]:第5章 类与对象
[在本页中加入书签] [收藏本书] [推荐本书]
  17xie论坛 > 本书讨论区 > 本页评论   (共0条)
发表评论

用户名称 匿名发表
评论内容
验证码

关于我们 | 版权声明 | 免责声明 | 诚聘英才 | 联系我们 | 合作伙伴 | 友情链接 | 广告合作 | 提交意见
Copyright © 2007 17xie.com 互联网协同写书平台 京ICP备08002671号