Java程序设计 第6章 数组
学习目标 理解数组的概念 掌握声明数组变量、创建数组、初始化数组 掌握如何访问数组元素 掌握向方法传递数组 了解如何复制数组 掌握搜索和排序算法 掌握多维数组的声明和创建
数组 数组(array)是相同类型变量的集合。 double[] myList = new double[10]; 5.6 4.5 3.3 13.2 4 34.33 34 45.45 99.993 1123 myList[0] myList[1] myList[2] myList[3] myList[4] myList[5] myList[6] myList[7] myList[8] myList[9] 引用 myList
声明数组引用变量 语法 数组变量是引用类型的变量,声明数组变量并不分配内存空间。 或者 datatype[] arrayRefVar; 例如: double[] myList; 或者 datatype arrayRefVar[]; double myList[]; 数组变量是引用类型的变量,声明数组变量并不分配内存空间。
创建数组 使用new操作符创建数组。 声明和创建在一条语句中。 arrayRefVar = new datatype[arraySize]; 例如: myList = new double[10]; 声明和创建在一条语句中。 datatype[] arrayRefVar= new datatype[arraySize]; 或者 datatype arrayRefVar[] = new datatype[arraySize]; double[] myList = new double[10]; double myList[] = new double[10];
数组初始化 新创建的数组对象,其元素根据类型被设置为默认的初始值。 数组可以在声明后的花括号中提供初始值。 数值类型为0 字符类型为’\u0000’ 布尔类型为false 引用类型为null 数组可以在声明后的花括号中提供初始值。 double[] myList = {1.9, 2.9, 3.4, 3.5} 或者 double[] myList; myList = new double[] {1.9, 2.9, 3.4, 3.5}
访问数组 一个数组的大小在创建这个数组之后不能被改变。可以用以下语法进行访问数组的长度: arrayRefVar.length 例如: myList.length的值为10。 数组元素通过索引进行访问。元素的索引从0开始,范围从0到length-1。 arrayRefVar[index] myList[0]表示数组的第一个元素 myList[9]表示数组的最后一个元素
增强的for循环(JDK 1.5) JDK 1.5引入一个新的for循环,可以不用下标就可以依次访问数组元素。语法: for(elementType value : arrayRefVar) { } 例如 for(int i = 0; i < myList.length; i++) { sum += myList[i]; for(double value : myList) { sum += value;
例 测试数组 编写程序,读入6个整数,找出它们中的最大值,并统计最大值出现的次数。 Example:TestArray.java
例 划分成绩等级 编写程序,读入学生分数,求最高分,然后根据下面的规则指定等级: 如果分数>=best – 10, 等级为A 如果分数>=best – 20, 等级为B 如果分数>=best – 30, 等级为C 如果分数>=best – 40, 等级为D 否则等级为F Example:AssignGrade.java
复制数组 直接使用赋值语句不能实现数组的复制,结果是两个数组引用变量指向同一个数组对象。 复制数组的方法 使用循环来复制每个元素 使用System.arraycopy方法 使用数组的clone方法 x: 1 y : 1 copy 基本类型 x : ref y : ref copy array 数组类型
向方法传递数组 可以将数组变量作为实参传递给方法。 也可以从方法中返回数组。 基本数据类型传递的是实际值的拷贝,修改形参,不影响实参。 数组引用变量中传递的是对象的引用,修改形参,将改变实参引用的数组对象。 也可以从方法中返回数组。 实参 : 1 形参 : 1 copy 基本类型 实参 : ref 形参 : ref array 数组类型
例 传递数组 编写两个方法交换数组中的两个元素。 swap方法交换两个int类型的参数 swapFirstTwoInArray方法交换数组参数的前两个元素 Example:TestPassArray.java
例 统计每个字符出现的次数 编写程序,完成以下任务 随机产生100个小写字母,并保存在一个字符数组中。 计算数组中每个字母出现的次数。 Example:CountLettersInArray.java
搜索数组 线性搜索法(linear searching)将一个值与数组的每个元素进行比较。如果找到相同的元素,返回元素的索引;否则返回-1。 二分搜索法(binary searching)是在一个已排序的数组中搜索特定元素。假设数组已按升序排列,将关键字与数组中间元素进行比较: 如果关键字比中间元素小,则在前一半数组中搜索; 如果关键字与中间元素相同,查找结束; 如果关键字比中间元素大,则在后一半数组中搜索。 Example:LinearSearch.java, BinarySearch.java
排序数组 2 9 5 4 8 1 6 选择排序算法:假设将数组按升序排列 算法 将列表中的元素最大值放在最后一个位置 将剩下元素的最大值放在倒数第二的位置 以此类推,直到剩下一个数为止。 2 9 5 4 8 1 6 Example:SelectionSort.java
Arrary类 java.util.Arrays.sort() java.util.Arrays.binarySearch() java.util.Arrays.equals() java.util.Arrays.fill()
二维数组 声明数组引用变量 创建数组并将引用赋值给变量 refVar = new dataType[rowSize][colSize]; dataType[][] refVar; 创建数组并将引用赋值给变量 refVar = new dataType[rowSize][colSize]; 在一条语句中声明和创建数组 dataType[][] refVar = new dataType[rowSize][colSize]; 或者 dataType refVar[][] = new dataType[rowSize][colSize];
int[][] matrix = new int[4][5] 二维数组示意图 [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] 7 [0] [1] [2] 1 2 3 4 5 6 7 8 9 10 11 12 [3] int[][] matrix = new int[4][5] matrix[2][1] = 7 int[][] array = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} };
二维数组的长度 二维数组的每个元素是一个一维数组。 数组X的长度是数组X的元素的个数,可由X.length得到。 元素X[i]是一个一维数组,其长度可由X[i].length得到。 X[0][0] X[1][0] X[2][0] X[0] X[1] X[2] X X[0][1] X[1][1] X[2][1] X[0][2] X[1][2] X[2][2] X[0][3] X[1][3] X[2][3] X.length is 3 X[0].length is 4 X[1].length is 4 X[2].length is 4
不规则数组 二维数组的每个元素(数组)的长度可以不同。 创建二维数组时,可以只指定第一下标。二维数组的每个元素为空,必须创建每个元素数组。 例如: int[][] x = new int[5][]; x[0] = new int[5]; x[1] = new int[4]; x[2] = new int[3]; x[3] = new int[2]; x[4] = new int[1]; x[0][0] x[1][0] x[2][0] x[0] x[1] x[2] x x[0][1] x[1][1] x[2][1] x[0][2] x[1][2] x[2][2] x[0][3] x[1][3] x[0][4] x[3][0] x[3][1] x[4][0] x[3] x[4]
例 给选择题评分 编写程序,给选择题评分。设有8个学生10个问题,答案存储在一个二维数组中。每行记录一个学生的答案。输出每个学生的评分结果。 0 1 2 3 4 5 6 7 8 9 学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 A B A C C D E E A D D B A B C A E E A D E D D A C B E E A D C B A E D C E E A D A B D C C D E E A D B B E C C D E E A D B B A C C D E E A D E B E C C D E E A D 答案 D B D C C D A E A D Example:GradeExam.java
例 使用数组计算所得税 美国的个人所得税根据纳税人情况和须纳税收入进行计算。编写程序,用户输入纳税人情况和须纳税收入,计算出2002年的所得税。 2002年美国个人所得税税率表 Example:ComputeTax.java
例 分数计算 编写程序计算班级中每个学生的总分。假设分数保存在三维数组中,数组的第1维代表学生,第2维代表试卷,第3维代表试卷的一部分的成绩。 部分0 部分1 部分2 部分3 部分4 部分5 部分6 学生0 学生1 学生2 学生3 学生4 试卷0 试卷1 试卷2 试卷3 试卷4 试卷5 试卷6 试卷7 Example:TotalScore.java