310 likes | 460 Views
Java 技术与应用. - Java 的数组字符串 ( 第 4 章 ). 西安交大 卫颜俊 2008 年 11 月 电子信箱: Mr.Java@163.com QQ: 610568018 网站 : 202.117.58.97/java. 1. 数组 (Array). 数组是一种复合数据类型,代表一组同类型的变量。 数组是一种特殊的对象。 从存储方式来看,数组所代表的变量按顺序连续存放,数组本身使用一个标识符来定义,称为数组名。 所代表的每一个变量称为数组元素,数组元素在内存中所处的位置称为下标。 数组的长度是指数组中的元素个数。
E N D
Java技术与应用 -Java的数组字符串(第4章) 西安交大 卫颜俊 2008年11月 电子信箱:Mr.Java@163.com QQ: 610568018 网站: 202.117.58.97/java
数组是一种复合数据类型,代表一组同类型的变量。数组是一种复合数据类型,代表一组同类型的变量。 • 数组是一种特殊的对象。 • 从存储方式来看,数组所代表的变量按顺序连续存放,数组本身使用一个标识符来定义,称为数组名。 • 所代表的每一个变量称为数组元素,数组元素在内存中所处的位置称为下标。 • 数组的长度是指数组中的元素个数。 • 数组也遵守一般变量的先定义后使用的原则。
数组举例 • 记录一个班的10名同学的数学成绩 • 定义10个变量:float score1,score2,…,score10分别存放每个同学的数学成绩 • 定义1个数组变量: score[10] • 其中,score.length ==10 • 每个元素为:score[0],score[1],…,score[8],score[9] • 数组为score[] • score[i](i=0,…,9)类型为float
一维数组 • 定义格式 类型名 数组名[][=初值];或 类型名[] 数组名[=初值]; 举例: • int ai[]; //定义一个整数数组 • float score[]; //定义一个float数组 • float[] score; • Object ao[]; //定义一个Object数组 • String names[]; //定义一个字符串数组 • byte[] rowvector, colvector, matrix[]; //分别定义两个字节数组和一个字节数组的数组 • MyClass<int>amc[]; //定义一个带参数的对象数组
一维数组的初始化 数组的定义中并不为数组元素分配内存 • 静态初始化 使用一对大括弧“{}”加数据来对数组进行初始化 举例: • int ai[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//数组ai有10个数组元素,即ai.length为10,每个元素类型为int • char[] ac = {'n', 'o', 't', ' ', 'a', ' ', 'S', 't', 'r', 'i', 'n', 'g'}; //数组ac有12个数组元素,即ac.length为12,每个元素类型为char • String countryNames[] = { "中国", "美国", "法国"};//数组countryNames有3个数组元素,即countryNames.length为3,每个元素类型为String • MyClass amc[] = { new MyClass(), new MyClass(), new MyClass() };//数组amc有3个数组元素,即amc.length为3,每个元素类型为MyClass • Color colorPalette[] = {Color.RED, Color.GREEN, Color.BLUE };//数组colorPalette有3个数组元素,即colorPalette.length为3,每个元素类型为Color
一维数组的初始化(2) • 动态初始化 使用构造对象的方法(new运算符)来初始化数组 举例: • int ai[] = new int[10];//数组ai有10个数组元素 • int length = 35; float score[] = new float[length];//数组score有35个数组元素 • String countryNames[] = new String[] { "中国", "美国", "法国"};//数组countryNames有3个数组元素,即countryNames.length为3,每个元素类型为String
一维数组的引用 举例: for (int i = 0; i < ai.length; i++) { System.out.println(ai[i] * ai[i]); }
一维数组的完整例子 【例4-1】模拟体育比赛中的胜、平和负3种状态10000次,统计并显示每种状态的次数。 ( (int) (Math.random() * 10000)) % 3 【例4-2】查找数组中是否存在某个数值。 关键代码: for (int x : arrayOfInts) { …}
二维数组 • 定义格式 • 类型名 数组名[][] [=初值];或 • 类型名[] 数组名[] [=初值];或 • 类型名[][] 数组名[=初值]; 举例: • int ai[][]; • int[] ai []; • int [][]ai;
二维数组的初始化 二维数组的定义中不为数组元素分配内存, 分静态初始化和动态初始化 举例: 1 : int ai1[][] = new int[3][3]; 2 : int ai2[][] = { 3 : {1, 2, 3}, {4, 5, 6}, { 7, 8, 9} 4 : }; 5 : int ai3[][] = new int[3][]; 6 : ai3[0] = new int[3]; 7 : ai3[1] = new int[2]; 8 : ai3[2] = new int[1]; 9 : int ai4[][] = { 10: {1, 2, 3}, {4, 5}, {6} 11: }; 12: int ai5[][] = { 13: {1, 2}, null, {3, 4, 5} 14: };
二维数组的引用 举例: for (int i = 0; i < ai4.length; i++) { for (int j = 0; j < ai4[i].length; j++) { System.out.println(ai4[i][j] * ai4[i][j]); } }
二维数组的完整例子 【例4-4】输出如下所示的杨辉三角形。 三角形中的每一行除最左和最右为1之外,中间的每一行每一列的值=上一行当前列的值+上一行前一列的值。
数组与算法 java.util.Arrays类和java.lange.System类中提供了数组的初始化、拷贝、克隆、比较、查找与排序等方法。 • 1. 初始化方法:System.fill(a,val); 其中,a为要初始化的数组,val为初始化值。 • 2. 拷贝方法:Arrays.arraycopy(src,srcPos,dest,destPos,length); 其中,src为原始数组,srcPos为原始数组起始下标,dest为目标数组,destPos为目标数组起始下标,length为要拷贝的元素个数。 • 3. 克隆方法:a.clone(); 其中,a为数组,返回值为目标数组。 “=”表示数组引用,而clone表示复制。
数组与算法(2) • 4. 比较方法:Arrays.equals(a1,a2); 其中,a1、a2为要比较的两个数组, “==”表示为同一个引用,而equals表示元素相等。 • 5. 数组排序方法:Arrays.sort(a); 其中,a为待排数组。 • 6. 查找方法:Arrays.binarySearch(a,key); 其中,a为待查数组,key为查找关键值,返回值为查找到的数组下标,如果未找到,返回-1。 • 7. 元素批输出方法:Arrays.toString(a); 其中,a为待输出数组,返回值为数组元素构成的字符串。如果直接输出a的话,得到的只是a的内存标识号,而不是所有元素值。
数组举例 • 【例4-7】数组与算法演示。
数组举例 • 【例4-14】对一组数据进行分析。原始数据如下表6-1所示: • 表6-1 W县2003-2006年苹果产量表(单位:万担) 要求预测2007年的产量,采用的算法: • 算术平均: • 几何平均: • 增长速度: • 发展速度:
字符串是指用一对双引号将若干个字符括起来组成的字符序列。字符串是指用一对双引号将若干个字符括起来组成的字符序列。 • Java语言中的字符串表面上是字符序列,内部却是使用对象来表示的,不能把字符串与字符数组等同起来。 • 包括定长字符串和可变长字符串 • 有时为了提高存取效率,采用定长字符串,使用String类的对象; • 有时则为了修改的灵活性,采用可变长字符串,使用StringBuffer类的对象。
定长字符串的定义格式 • String 变量名=<字符串文字量>; 其中,<字符串文字量>为由一对双引号("")括起来的字符序列。 • String() 构造一个空字符串 • String(String original) 由原始字符串构造新的字符串 • String(char[] value) 由字符数组构造字符串 • String(char[] value,int offset,int count) 由字符数组的一部分构造字符串 • 举例: String word="月随碧山转,水合青山流。杳如星河上,但觉云林幽。"; String s=new String(); String firstName=new String("杰克"); char asc[]={'伦', 敦'} String lastname=new String(asc); String name=new String(firstName +'•'+ lastname);
定长字符串的引用格式 • 对于字符串文字量可以直接使用,而一旦定义好一个字符串变量,就可以按名存取。 • String类提供了一个方法length()取得字符串的长度,即它所包含的字符个数。 • 比如上例中的s.length()为0,name.length()为5等。
定长字符串的处理算法 • “+”运算符,不但可以将两个字符串拼接,还可以将其它类型的值与字符串拼接,得到一个新的字符串。 • String类的常用方法
定长字符串举例 • 【例4-8】定长字符串处理方法综合演示。 • 【例4-9】判断字符串是否为回文。
可变长字符串 • 举例:对于可变长字符串"Dot Saw I",其长度为9,而容量为17。
可变长字符串的定义格式 • StringBuffer() 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符。 • StringBuffer(int capacity) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。 • StringBuffer(String str) 构造一个字符串缓冲区,并将其初始化为指定的字符串内容。 • 举例: StringBuffer s1 = new StringBuffer(); StringBuffer s2 = new StringBuffer(28); StringBuffer s3 = new StringBuffer("地球只有一个,请爱惜她!");
可变长字符串的引用格式 • StringBuffer类提供length()方法计算长度,capacity()方法计算容量。
可变长字符串的处理算法 • StringBuffer类的常用方法
可变长字符串举例 • 【例4-10】可变长字符串处理方法综合演示。 • 【例4-11】字符串、字符数组的转换。 • 【例4-12】从字符串中提取单词。
可变长字符串举例 • 【例4-13】字符串四则运算表达式的计算。 算法简述:StringTokenizer类是java.util包中提供的一个解析字符串的类,其方法如下: • StringTokenizer(String str, String delim) 为指定字符串构造一个StringTokenizer类的对象。其中,str为原始字符串,delim参数中的字符都是起分隔标记作用的分隔符序列。分隔符字符本身不作为标记。 • boolean hasMoreTokens() 测试此标记的字符串中是否还有更多的可用标记。如果此方法返回true,那么后续调用无参数的nextToken方法将成功地返回一个标记。 • public String nextToken() 返回下一个标记。
综合例子 • 【例4-15】给定一篇英文,要求完成以下功能: (1) 显示所有汉字符号; (2) 将字母转换为大写; (3) 去掉非字母符号; (4) 统计各个字母出现的次数(不区分大小写); (5) 每个字母只保留一个。
本讲结束! 谢谢!