Java第5章-数组与字符串课件_第1页
Java第5章-数组与字符串课件_第2页
Java第5章-数组与字符串课件_第3页
Java第5章-数组与字符串课件_第4页
Java第5章-数组与字符串课件_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 数组与字符串理解数组的概念,并能声明数组变量,创建数组实例,访问数组元素;掌握二维数组,并能创建二维数组实例,访问二维数组元素;掌握数组的相关操作与数组包装类Arrays,掌握不变字符串String类。学习目标:5.1 数组5.2 二维数组5.3 数组操作与数组包装类Arrays5.4 不变字符串类String5.5 实训5.6 习题第5章 数组与字符串5.1.1 声明数组变量5.1.2 创建数组实例5.1.3 访问数组元素5.1 数组 所谓数组就是相同数据类型的元素按一定顺序排列的集合。在Java语言中数组元素可以由简单数据类型的量组成,也可以由对象组成。数组中的每个元素都具有相同的

2、数据类型,可以用一个数组名和一个下标来唯一确定数组元素的个数,即数组的长度。 在Java语言中,数组的下标是从0开始的。如果需要在一个结构总存储不同类型的数据,或者需要长度可以动态改变的结构,可以考虑使用向量Vector类型。 一维数组是一组相关变量的一维集合,其逻辑结构是线性表。要使用一维数组,需要经过定义、初始化和应用等过程。 使用Java的数组,一般要经过3个步骤:声明数组、分配内存空间、数组元素赋值。前两个步骤的语法如下: 在数组的声明格式里,“数据类型”是声明数组元素的数据类型,可以是Java中任意的数据类型,包括简单类型和结构类型。“数组名”是用来统一这些相同数据类型的名称,其命名

3、规则和变量的命名规则相同。 指明该变量是一个5.1.1 声明数组变量 数组类型的变量,它可以放在数组名的前面,也可以放在数组名的后面。与c、c+不同,Java在数组的定义中并不为数组元素分配内存,因此 中不用给出数组中的个数(即数组的长度),但必须为它分配内存空间后才可使用。 数组声明之后,接下来是要分配数组所需的内存,这时必须用运算符new,其中“个数”告诉编译器,所声明的数组要存放多少个元素,所以new运算符是通知编译器根据括号里的个数,在内存中分配一块空间供该数组使用。利用new运算符进行数组元素占用内存空间分配的方式称为动态内存分配方式。 下面举例来说明数组的定义,例如: 在声明数组时

4、,也可以将两个语句合并成一行,格式如下: 利用这种格式在声明数组的同时,也分配一块内存供数组使用。如上面的两个语句可以写成如下的一句: Int x =new int10;下面是一维数组声明的几个例子。 数组的定义和创建是有区别的,定义只需声明数组类型,并没有数组长度的要求。与对象引用的含义相同,仅表示某个数组,没有对应的内存空间。创建是给数组分配内存空间。它可以用new运算符,也可以用直接枚举初始化来创建。数组元素可以是基本数据类型,也可以是对象类型。 对数组元素直接枚举初始化来创建进行赋值,即在定义数组的同时进行初始化。 例如:int a=1,2,3,4,5; 用逗号(,)分隔数组的各个元素

5、,系统自动为数组分配一定空间。5.1.2 创建数组实例例5.1 是创建一维数组的实例。 解题思路:首先创建了一个一维数组anArray,然后通过for循环对数组中每个元素赋值并显示。 代码:程序ArrayOne.javapublic class ArrayOne public static void main(String args) int anArray; /声明一个整数数组anArray=new int10; /创建一个整数数组对象for(int i=0;ianArray.length;i+)anArrayi=i; /对数组元素赋值System.out.print(anArrayi+ )

6、;System.out.println();运行结果如下: 当定义了一个数组,并用运算符new为它分配了内存空间以后,就可以引用数组中的每个元素了。要想使用数组里的元素,可以利用数组名和下标来实现。数组元素的引用方式为: 其中“下标”可以是整型或表达式。如a5+i(i为整数)。Java数组的下标是从0开始的。 例如:int x=new int10;5.1.3 访问数组元素 其中x0代表数组中第1个元素,x1代表第2个元素,x9代表第10个元素,也就是最后一个元素。另外,与C、C+不同,Java对数组元素要进行越界检查以保证安全性。同时,对于每个数组都有一个属性length指明它的长度,如x.

7、length指出数组x所含的元素个数。 例5.2 数组中的每个元素赋值,然后按逆序输出。 解题思路:声明一个一维数组,其长度为5,利用循环对数组元素进行赋值,然后再利用另一个循环逆循环输出数组元素的内容。 代码:程序ArrayTest.javapublic class ArrayTestpublic static void main(String args)int i;int a=new int5;for(i=0;i=0;i-)System.out.println(a+i+=+ai); 运行结果如下:例5.3 编写斐波那契(Fibonacci)数列的程序解题思路:斐波那契(Fibonacci)

8、数列的定义公式为:F1=F2=1,Fn=Fn-1+Fn-2(n=3)代码:程序ClassFibonacci.java public class ClassFibonacci public static void main(String args)int i;int f=new int10;f0=f1=1;for(i=2;i10;i+)fi=fi-1+fi-2;for(i=1;i=10;i+)System.out.println(F+i+=+fi-1); 运行结果如下:5.2.1 声明数组变量5.2.2 创建数组实例5.2.3 访问数组元素5.2.4 案例一:员工工资存储系统5.2 二维数组 虽

9、然一维数组可以处理简单的数据,但是在实际的应用汇总仍显不足,所以Java语言提供了多维数组。但在Java语言中并没有真正的多维数组,所谓多维数组只是数组的数组。所谓二维数组,是指一个数组的元素是一维数组。二维数组以一维数组为基础扩展而来。以此类推,一维数组的多次嵌套定义构成了多维数组。 二维数组的声明方式与一维数组类似,内存分配也一样用new运算符。其声明与分配内存的格式如下: 与一维数组不同的是,二维数组在分配内存时,必须告诉编译器二维数组行与列的个数。因此在上面的格式中,“行数”是告诉编译器所声明的数组有多少行,“列数”则是赋值每行中有多少列,如: int a ; /声明整型数组a a=n

10、ew34; /分配一块内存空间,供3行4列的整型数组a使用5.2.1 声明数组变量同样地也可以用较为简洁的方式来声明数组,其格式如下:以该种方式声明的数组,在声明的同时就分配一块内存空间供该数组使用。如: int a =new int34; 二维数组在实际的使用过程中也分为静态初始化和动态初始化两种。下面以初始化实例来加以说明: 1.静态初始化实例 int number =1,2,3,4,5,6; Charch =a,b,c,d,e,f; 上例是在建立数组的同时用大括号中的值给它赋初值,得到了两个二维整型数组和二维字符数组。 2.动态初始化实例 int array_int=new int33;

11、 /定义数组并为 其分配存储空间 long array_long=new long555.2.2 创建数组实例例5.3 创建二维数组实例 解题思路:首先静态初始化了一个两行三列的二维数组arr,并赋值,然后用双重for循环进行输出;接着动态初始化一个三行三列的二维数组num,并依此为每个元素赋值,最后也同样用双重for循环进行了值输出。 程序代码:Array_2.java public class Array_2 public static void main(String args) int arr = 1,2,3,4,5,6; /定义了两行三列的二维数组并赋值 for(int x = 0;

12、 xarr.length; x+) /定位行 for(int y = 0; yarrx.length; y+) /定位每行的元素个数 System.out.print(arrxy+ ); System.out.println(); char num = new char 33; /定义了三行三列的二维数组 num00 = a; /给第一行第一个元素赋值 num01 = b; /给第一行第二个元素赋值 num02 = c; /给第一行第三个元素赋值 num10 = d; /给第二行第一个元素赋值 num11 = e; /给第二行第二个元素赋值 num12 = f; /给第二行第三个元素赋值 nu

13、m20 = j; /给第三行第一个元素赋值 num21 = h; /给第三行第二个元素赋值 num22 = i; /给第三行第三个元素赋值 for(int x =0; xnum.length; x+) /定位行 for(int y = 0; ynumx.length; y+) /定位每行的元素个数 System.out.print(numxy+ ); System.out.println(); 运行结果如下: 对二维数组进行初始化后,就可以在程序中引用数组的元素了。二维数组元素的引用是通过数组名和下标值来进行的,其一般格式如下: 其中, Array_Name为数组名:index1为数组元素的高

14、维下标;index2为数组的低维下标。二维数组中,下标同样是一个int类型数,也可以使用与int类型进行自动类型转换的类型,如short、byte、char类型(使用时转换成int类型),但下标不能是long类型的数。5.2.3 访问数组元素 在Java中,并不要求多维数组的每一维长度相同。例如: Int array3=new int3; 其对应的二维表如表8.1所示。表5.1 java中二维数组存储格式【说明】表5.1中并不要求n=m=k,实际应用中有可能nmk。例 5.4 矩阵相乘解题思路:两个矩阵Amn、Bnl相乘得到Cml,每个元素Cij=?aik*bk (i=1.m,n=1.n) 程

15、序代码:MatrixMultiply.java public class MatrixMultiply public static void main(String args) int i,j,k; int a=new int23; int b=1,5,2,8,5,9,10,-3,2,7,-5,-18;/ 矩阵B赋值 int c=new int24; for(i=0;i2;i+) for(j=0;j3;j+) aij=(i+1)*(j+2); / 矩阵A赋值 for(i=0;i2;i+) for(j=0;j4;j+) cij=0; for(k=0;k3;k+) cij+=aik*bkj; /

16、矩阵C赋值 System.out.println(n*MatrixA*); for(i=0;i2;i+) for(j=0;j3;j+) System.out.print(aij+ ); /输出矩阵A的值 System.out.println(); System.out.println(n*MatrixB*); for(i=0;i3;i+) for(j=0;j4;j+) System.out.print(bij+ ); /输出矩阵B的值 System.out.println(); System.out.println(n*MatrixC*); for(i=0;i2;i+) for(j=0;j4;

17、j+) System.out.print(cij+ ); /输出矩阵C的值 System.out.println(); 运行结果如下:【任务目的】 掌握二维数组的声明与创建【任务要求】 用户能够录入员工工资,并存储数据。【解题思路】 员工人数作为数组索引,首先创建一个二维数组,然后用For循环对数组进行循环存储。 代码:程序Salary.java import java.util.Scanner; public class Salary 5.2.4 案例一:员工工资存储系统 public static void main(String args) Scanner scanner = new S

18、canner(System.in);System.out.print(请输入员工人数:);int count = scanner.nextInt();String arr = new Salary().salaryArray(count);if (arr != null) System.out.println(已保存.);public String salaryArray(int length) String arr = new Stringlength2; /定义一个二维数组Scanner scanner = new Scanner(System.in);for (int i = 0; i

19、arr.length; i+) / 循环存储System.out.print(请输入员工姓名:);String name = scanner.next();arri0 = name;System.out.print(请输入员工工资:);Double salary = scanner.nextDouble();arri1 = salary.toString();return arr; 运行结果为:5.3.1 数组遍历5.3.2 数组排序5.3.3 数组复制5.3.4 案例二:员工工资存储系统改版5.3 数组操作与数组包装类Arrays 对数组的一些基本操作,像排序、搜索与比较等是很常见的。在Ja

20、va中提供了Arrays类可以协助作这几个操作。Arrays类位于java.util包中能方便地操作数组,它提供的所有方法都是静态的,如表5.2所示,具有以下功能:表5.2 Arrays类提供的几个方法说明 遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现。遍历一维数组很简单,也很好理解,下面介绍遍历二维数组的方法。 遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度。 例5.5 遍历二维数组 解题思路:先定义二维数组,然后将二维数组中的元素呈 梯形输出。 5.3.1 数组遍历public class Trap public static vo

21、id main(String args) int b=new int 1,2,3,4,5,6;/定义二维数组 for(int k=0;kb.length;k+) for(int c=0;cbk.length;c+) /循环遍历二维数组中的每个元素 System.out.print(bkc+ ); /将数组中的元素输出 System.out.println(); 运行结果如下: 通过Arrays类的静态sort()方法可实现对数组排序,sort()方法提供了许多重载形式,可对任意数组进行升序排序。 语法如下: 其中,object是指进行排序的数组名称。例5.6 对数组进行排序 解题思路:创建一维

22、数组,并将数组排序后输出。 代码:程序Asort.java5.3.2 数组排序import java.util.Arrays;public class Asort public static void main(String args) int arr=new int23,45,10,6; /声明数组Arrays.sort(arr); /将数组进行排序for(int i=0;iarr.length;i+)System.out.println(arri); /将排序后数组中的各个元素输出 运行结果如下: 【说明】上述实例是对整数数组进行排序。Java中的String类型数组的排序算法是根据字典编

23、排顺序排序的,因此数字排在字母前面,大写字母排在小写字母前面。 Arrays类的copyOf()方法与copyOfRange()方法可实现对数组的复制。copyOf()方法复制数组指定长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中。 1.copyOf()方法 该方法提供了很多种重载形式,来满足不同类型数组的复制。 语法如下: copyOf(arr,int newlength) 1)arr:要进行复制的数组。 2)newlength:int型常量,指复制后的新数组的长度。如果 新数组的长度大于数组arr的长度,则用0填充(根据复制数组的类型来决定填充的值,整型数组用

24、0填充,char型数组5.3.3 数组复制 则会使用null来填充);如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一元素开始截取至满足新数组长度为止。例5.7 实现数组的复制 解题思路:先创建一维数组,实现将此数组复制得到一个长度是5的新数组,并将新数组输出。代码:程序Acopy.java import java.util.Arrays; public class Acopy public static void main(String args) int arr=new int23,32,10;int newarr=Arrays.copyOf(arr, 5); /复制数组a

25、rrfor(int i=0;inewarr.length;i+)System.out.println(newarri); /将新数组输出运行结果如下:2. copyOfRange()方法 该方法同样提供了多种重载形式。 语法如下: 1)arr:要进行复制的数组对象。 2)formIndex:指定开始复制数组的索引位置。formIndex必须在0至整个数组的长度之间。新数组包括索引是formIndex的元素。 3)toIndex:要复制范围的最后索引位置。可以大于数组arr的长度。新数组不包括索引是toIndex的元素。例 5.8 实现将指定数组长度复制到一个新的数组 解题思路:先创建一维数组,

26、并将数组中索引位置是0-4之间的元素复制到新数组中,最后将新数组输出。 代码:程序Recopy.java import java.util.Arrays; public class Recopy public static void main(String args) int arr=new int12,31,23,21,67,9; /定义数组int newarr=Arrays.copyOfRange(arr, 0, 4); /复制数组 for(int i=0;inewarr.length;i+) System.out.println(newarri); 运行结果如下:【任务目的】掌握二维数组

27、的遍历,员工工资存储系统改版【任务要求】用户录入员工工资后,打印显示【解题思路】 员工人数作为数组索引,首先创建一个二维数组,然后用For循环对数组进行循环存储,最后用For循环对数组进行输出。代码:程序Salary2.javaimport java.util.Scanner;public class Salary2 5.3.4 案例二:员工工资存储系统改版public static void main(String args) Scanner scanner = new Scanner(System.in);System.out.print(请输入员工人数:);int count = sca

28、nner.nextInt();String arr = new Salary2().salaryArray(count);if (arr != null & arr.length != 0) new Salary2().salaryPrint(arr);System.out.println(已保存.);public String salaryArray(int length) String arr = new Stringlength2; / 定义一个二维数组 Scanner scanner = new Scanner(System.in);for (int i = 0; i arr.leng

29、th; i+) / 循环存储System.out.print(请输入员工姓名:);String name = scanner.next();arri0 = name;System.out.print(请输入员工工资:);Double salary = scanner.nextDouble();arri1 = salary.toString();return arr; public void salaryPrint(String arr) for (int i = 0; i arr.length; i+) System.out.println(员工姓名: + arri0 + 员工工资: + ar

30、ri1); 运行结果为: 字符串是在Java中最常使用的对象,但也是最常被忽视的对象。字符串的本质是字符类型的数组。通常将字符串视为String类的一个实例,即将其视为存在于程序之中的对象。 本节将会详细介绍字符串类String、字符串缓冲类StringBuffer、字符串建造类StringBuilder。这3种字符串都是16位的Unicode字符序列,并且这3个类都被声明为final类,因此不能被继承。 String类是java.lang包中的一个final类,主要用来创建一个字符串对象。Java中的字符串使用String对象表示,也可以使用直接赋值方式创建,这不同于其他的设计语言。例如,在

31、C语言中字符串是一个字符数组,可以通过使用数组的方式来使用字符串。5.4 不变字符串类String 在Java语言中字符串必须包含在一对“”(双引号)之内。字符串是由许多个字符连接而成的。可以通过如下语法格式来声明字符串变量: String:指定该变量为字符串类型。 str:任意有效的标识符,表示字符串变量的名称。 null:如果省略null,表示str变量时未初始化的状态,否则表示声明的字符串的值就等于null。1.创建String对象 String类中提供了多种方法来创建String类的对象,如表5.3所示。表5.3 String类的构造方法例5.9 String类的7种构造方法的使用 解

32、题思路:用7种构造方法分别创建String类,其中s5是由字节数组byteArray创建的字符串,数组的每个字节的值代表汉子的国际机内码。 代码:程序String1.java import java.io.*; public class String1 public static void main(String args) char charArray=b,i,r,t,h, ,d,a,y; byte byteArray=-61,-26,-49,-14,-74,-44,-49,-13; StringBuffer buffer ; String s,s1,s2,s3,s4,s5,s6,s7; s

33、=new String(hello); buffer=new StringBuffer(Welcome to you!); s1=new String(); s2=new String(s); s3=new String(charArray); s4=new String(charArray,6,3); s5=new String(byteArray); s6=new String(byteArray,2,4); s7=new String(buffer); System.out.println(s1=+s1);System.out.println(s2=+s2); System.out.pr

34、intln(s3=+s3);System.out.println(s4=+s4); System.out.println(s5=+s5);System.out.println(s6=+s6); System.out.println(s7=+s7);运行结果如下:2. String类的常用方法 创建一个String类的对象后,使用相应类的成员方法创建的对象进行处理,即可完成编程所需要的功能。Java.lang.String类的常用成员方法如下表5.4所示:表5.4 String类的常用方法例 5.10 String类的常用成员方法举例解题思路:先使用常用成员方法创建各对象,然后依次输出。publ

35、ic class String2 public static void main(String args) String s=I love you my baby!;int len=s.length();char c=s.charAt(3);int n1=s.indexOf(o);int n2=s.indexOf(my,1); String s2=s.substring(6);String s3=s.substring(6,11); System.out.println(s=+s+,length=+len);System.out.println(s.charAt(3)=+c);System.o

36、ut.println(s.indexOf(0)=+n1);System.out.println(s.indexOf(my,1)=+n2);System.out.println(s.substring(6)=+s2);System.out.println(s.substring(6,11)=+s3); 运行结果如下:实训:金额大小写转换【任务目的】通过数组实现数字的大小写转换【任务要求】掌握将数字转换成中文金额的大写形式【解题思路】首先从命令行输入这个浮点数,判断该数据是否合法,若合法,将其转换为大写形式。代码:程序Trans2RMB.java public class Trans2RMB 5.

37、5 实训public static void main(String args) System.out.println(n-将数字转换成中文金额的大写形式-n);Trans2RMB t2r = new Trans2RMB();String s = t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum();if (!.equals(s) System.out.println(转换成中文后为: + s);System.out.println(n-);private String getNum() String s = null;System.o

38、ut.println(请输入一个数字(精确到小数点后两位):);java.util.Scanner scanner = new java.util.Scanner(System.in);s = scanner.next();scanner.close();if (this.checkNum(s) return s; else return ; private boolean checkNum(String s) try float f = Float.valueOf(s);if (f 13) System.out.println(输入数据过大!(整数部分最多13位!));return ;String smallOnly = s.substring(index + 1);/ 如果小数部分大于两位,只截取小数点后两位if (smallOnly.length() 2) String roundSmall = smallOnly.substring(0, 2);s = intOnly + . + roundSmall;return s;private String numFormat(int flag, String s) int sLength = s.length();/ 货币大写形式String bigLetter = 零, 壹, 贰, 叁, 肆, 伍,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论