第九章 数组
提纲
- 9.1 数组的概念
- 9.1.1 为什么要用数组
- 9.1.2 概念
- 9.1.3 数组的好处
- 9.1.4 数组的特点
- 9.2 一维数组
- 9.2.1 声明数组的几种方式
- 9.2.2 给数组赋值、获取数组的长度、获取数组中的值
- 9.2.3 各种数据类型数组的初始值
- 9.2.4 经典示例
- 9.3 二维数组
- 9.3.1 概念
- 9.3.2 声明数组的几种方式
- 9.3.3 给二维数组赋值
- 9.3.4 获取长度
- 9.4 作业
- 9.4.1 一维数组作业
- 9.4.2 二维数组作业
9.1 数组的概念
- 9.1.1 为什么要用数组:如果需要存储大量的数据,例如如果需要读取100个数,那么就需要定义100个变量,显然重复写100次代码,是没有太大意义的。如何解决这个问题,Java语言提供了数组(array)的数据结构,是一个容器可以存储相同数据类型的元素,可以将100个数存储到数组中。
- 9.1.2 概念:同一种类型数据的集合。其实数组就是一个容器。数组是一种用于存储数据的方式,能存数据的地方我们称之为容器,容器里装的东西就是数组的元素, 数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素,也就是数组一旦定义,那么里边存储的数据类型也就确定了。
- 9.1.3 数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
- 9.1.4 数组的特点:
- 能存储任意类型的数据,基本数据类型与引用数据类型都可以。
- 数组一旦声明,所装的元素只能有一种,且数组的长度一旦确定,便不可再变。(比如定义了长度5的int类型的数组,则不能放五个以上的int以外的元素。)
- 数组存储的元素从0开始编号,从数组长度减一结束。下标就是取数组中的值。
9.2 一维数组
-
9.2.1 声明数组的几种方式:
- 方式一:定义一个数组对象。(常用)
- 语法结构:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
- 示例:int[] arr = new int[5];
- 方式二:
- 语法结构:元素类型 数组名[] = new 元素类型[元素个数或数组长度];
- 示例:int arr[] = new int[5];
- 方式三:定义一个数组对象并初始化值。(常用)
- 语法结构:元素类型[] 数组名 = {元素,元素,……};
- 示例:int[] arr = {3,5,1,7};
- 方式四:
- 语法结构:元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
- 示例:int[] arr = new int[]{3,5,1,7};
- 方式一:定义一个数组对象。(常用)
-
9.2.2 给数组赋值、获取数组的长度、获取数组中的值
//定义了一个int的整型数组,长度为5,且之后使用时不可再变。 int[] arry=new int[5]; //给数组赋值 arry[0]=5; arry[1]='a'; arry[2]=44; arry[3]=22; arry[4]=77; //arry[5]=88;//编写时不会报错,运行时会报错,因为已经超过了数组的长度 //获取数组的长度 //打印数组长度的是调用数组的length属性 System.out.println(arry.length); //获取数组中的值: //方法一(直接获取): System.out.println(arry[0]); System.out.println(arry[1]); ..... //方法二(循环获取):循环数组的长度 for (int i = 0; i < arry.length; i++) { System.out.println(arry[i]); }
-
9.2.3 各种数据类型数组的初始值
byte[] b = new byte[1]; short[] s = new short[1]; char[] c = new char[1]; int[] i = new int[1]; long[] l = new long[1]; float[] f = new float[1]; double[] d = new double[1]; String[] str = new String[1]; System.out.println("b="+b[0]+",s="+s[0]+",c="+c[0]+",i="+i[0]+"," + "l="+l[0]+",f="+f[0]+",d="+d[0]+",str="+str[0]); //数组是有初始值的 //打印结果:b=0,s=0,c=,i=0,l=0,f=0.0,d=0.0,str=null byte bb; System.out.println(bb);//会报错,因为单独声明变量不赋值是没有初始值的。
-
9.2.4 经典示例:
-
9.2.4.1 例1:求一个数字类型数组中的最大值、最小值。
//定义一个int类型的数组并且初始化 int[] arri = {1,-1,50,99,86,666,128,-55}; //打印这个数组,以便查看比较 for (int i = 0; i < arri.length; i++) { System.out.print(arri[i]+" "); } //跨行 System.out.println(); //定义一个最大值,并且将数组的第一个值赋值给max int max = arri[0]; //定义一个最小值,并且将数组的第一个值赋值给min int min = arri[0]; //循环这个数组 for (int i = 1; i < arri.length; i++) { //从第二个数开始往后面的数比较,如果这个最大值比要比较的值小,则将这个值赋值给最大值, //然后继续进行比较,此时max永远都是目前的最大值,直到比较完最后一个数。 if (max < arri[i]) { max = arri[i]; } //如果这个最大值比要比较的值大,则将这个值赋值给最小值,然后继续进行比较 if (min > arri[i]) { min = arri[i]; } } System.out.println("max="+max+",min="+min); //执行结果: 1 -1 50 99 86 666 128 -55 max=666,min=-55
-
9.2.4.2 例2:将一个数字类型数组从小到大排序。(实现冒泡排序)
//定义一个int类型的数组并且初始化 int[] a = {12,50,69,20,44,100,1,55,2,9,500,1000,1}; //打印这个数组,以便查看比较 for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } System.out.println(); int temp;//定义中间变量 //比较轮数 for (int i = 0; i < a.length; i++) { //比较次数,从要比较的这个数的下一个数开始比较 for (int j = i+1; j < a.length; j++) { //如果当前值比要比较的值大,则交换 if (a[i]>a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } } } for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } //执行结果: 排序之前:12 50 69 20 44 100 1 55 2 9 500 1000 1 排序之后:1 1 2 9 12 20 44 50 55 69 100 500 1000
-
9.2.4.3 例3:删除数字型数组中的某个值,重新组成一个新的数组。(int[] a = {12,50,69,20,44,100,1,55,2,9,500,1000};删除数组中1,第七个位置,下标为6)
//删除第七个位置的数字1 int[] a = {12,50,69,20,44,100,1,55,2,9,500,1000};//1的位置是a[6] int[] b = new int[a.length-1];//定义一个新的数组,长度比原数组小1 System.out.print("删除之前:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } System.out.println(); for (int i = 0; i < a.length; i++) { //要删除的是第七个位置,那么前六个位置是不需要动的,直接将下标小于6的值全部赋值给新数组 if (i<6) { b[i] = a[i]; //当下标为6时到了要删除的值,则进行跳过,将第七个位置后面的值赋值给新数组 } else if(i>6){ b[i-1] = a[i]; } } System.out.print("删除之后:"); for (int i = 0; i < b.length; i++) { System.out.print(b[i]+" "); } //执行结果: 删除之前:12 50 69 20 44 100 1 55 2 9 500 1000 删除之后:12 50 69 20 44 100 55 2 9 500 1000
-
9.2.4.4 例4:在数组的某个位置增加一个值。(int[] a = {12,50,69,20,44,100,1,55,2,9,500,1000};加入999到第七个位置)
//在100和1之间增加一个数为999,即第六个位置下标为5之后加入一个值,加入的值为第七个位置 int[] a = {12,50,69,20,44,100,1,55,2,9,500,1000}; int[] b = new int[a.length+1];//创建一个新的数组,数组长度比原数组加1 //因为加入一个值后,数组长度加1,所以循环新数组 for (int i = 0; i < b.length; i++) { //前六个位置的值不变,直接赋值 if (i<6) { b[i] = a[i]; } else if(i == 6){//要插入的位置为第七个,当下标为6时,插入这个值 b[i] = 999; } else if(i>6){//下标大于6之后,新数组与原数组的下标多1 b[i] = a[i-1]; } } for (int i = 0; i < b.length; i++) { System.out.print(b[i]+" "); }
-
9.2.4.5 例5:定义一个数组,复制到一个新数组中。
int[] x = {1,2}; int[] y = new int[x.length]; //方式一:用循环实现复制 for (int i = 0; i < y.length; i++) { y[i]=x[i]; } //方式二:直接相等。这种方法跟y数组长度没有关系 y = x; //方式三:调用clone方法 y = x.clone(); //方式四:调用arraycopy方法//变量依次是(原数组,从原数组第几位的下标开始,目标数组,从第几位的下标开始粘贴,复制长度) System.arraycopy(x, 0, y, 0, x.length); System.out.print("原数组:"); for (int i = 0; i < x.length; i++) { System.out.print(x[i]+" "); } System.out.println(); System.out.print("复制的数组:"); for (int i = 0; i < y.length; i++) { System.out.print(y[i]+" "); } //执行结果: 原数组:1 2 复制的数组:1 2
-
9.2.4.6 例6:定义两个数组,相加之后复制到一个新数组
int[] a={1,2,3,2}; int[] b={4,2,90,8,98}; int[] d3 = new int[a.length + b.length]; //方法一: System.arraycopy(a, 0, d3, 0, a.length);//将第一个数组全部复制给d3,且从d3的第0个位置开始 System.arraycopy(b, 0, d3, a.length, b.length);//将第二个数组全部复制给d3,且从d3的第一个数组长度位置开始 //方法二:循环实现 for (int i = 0; i < d3.length; i++) { if (i < a.length) { d3[i] = a[i]; } else { d3[i] = b[i-a.length]; } } System.out.print("第一个数组:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } System.out.println(); System.out.print("第二个数组:"); for (int i = 0; i < b.length; i++) { System.out.print(b[i]+" "); } System.out.println(); System.out.print("合并后的数组:"); for (int i = 0; i < d3.length; i++) { System.out.print(d3[i]+" "); }
-
9.2.4.7 例7:定义一个数组,将这个数组的内容反转。(比如:有一个数组int[] arr = {1,4,2,5},反转后变成{5,2,4,1})
//方法一: String[] arr = {"我","很","爱","Java","哟"}; System.out.print("数组的原有内容:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } String temp; for (int i = 0; i < arr.length/2; i++) { //将前后对调 temp = arr[i]; arr[i] = arr[arr.length-i-1]; arr[arr.length-i-1] = temp; } System.out.println(); System.out.print("数组反转后的内容:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } //方法二: String[] arr = {"我","很","爱","Java","哟"}; String[] arrNew = new String[arr.length]; System.out.print("数组的原有内容:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } for (int i = 0; i < arr.length; i++) { //当i=0时,arrNew[4] = "我"; //当i=1时,arrNew[3] = "很"; arrNew[arrNew.length-1-i] = arr[i]; } System.out.print("\n新数组反转后的内容:"); for (int i = 0; i < arrNew.length; i++) { System.out.print(arrNew[i]+" "); } //执行结果: 数组的原有内容:我 很 爱 Java 哟 数组反转后的内容:哟 Java 爱 很 我
-
9.3 二维数组
-
9.3.1 概念:二维数组就像一张表格,有行,有列。
-
9.3.2 声明数组的几种方式:
- 方式一:
- 语法结构:元素类型[][] 数组名 = new 元素类型[行数(一维数组的个数)][每一行的列数(一维数组的元素个数)];
- 示例:int[][] a = new int[3][4];//定义一个三行四列的数组
- 方式二:
- 语法结构:元素类型[][] 数组名 = {{元素,元素,元素…},{元素,元素,元素…},……};
- int[][] b = {{1,2,3},{1,2,3},{1,2,3}};
- 方式一:
-
9.3.3 给二维数组赋值
//定义一个两行三列的数组 int[][] a = new int[2][3]; a[0][0] = 1; a[0][1] = 2; a[0][2] = 3; a[1][0] = 4; a[1][1] = 5; a[1][2] = 6; //第一个[]中下标不能超过定义数组中第一个[2]中的2-1的值。 //第二个[]中下标不能超过定义数组中第二个[3]中的3-1的值。
-
9.3.4 获取长度
//定义一个两行三列的数组 int[][] a = new int[2][3]; System.out.println("行数(即一维数组的个数)为:"+a.length); System.out.println("列数(每个一维数组元素的个数)为:"+a[0].length); //打印arrs二维数组 //外层循环打印行 for (int i = 0; i < arrs.length; i++) { for (int j = 0; j < arrs[0].length; j++) { System.out.print(arrs[i][j]+"\t"); } System.out.println(); } //执行结果: 行数(即一维数组的个数)为:2 列数(每个一维数组元素的个数)为:3。由于每一行都是一样的所以,写a[0].length,a[1].length都是一样的。 //直接定义一个二维数组并进行初始化 int[][] b = {{1,2,3},{11,22},{333}}; System.out.println("行数(即一维数组的个数)为:"+b.length); System.out.println("第一行列数为:"+b[0].length); System.out.println("第二行列数为:"+b[1].length); System.out.println("第三行列数为:"+b[2].length); //编写不会报错,执行过程报错,因为第二行的列数只有2,打印第三个数是没有的 System.out.println(b[1][2]); //打印arrs2二维数组 for (int i = 0; i < arrs2.length; i++) { for (int j = 0; j < arrs2[i].length; j++) { System.out.print(arrs2[i][j]+"\t"); } System.out.println(); } //执行结果: 第一行列数为:3 第二行列数为:2 第三行列数为:1
9.4 作业
- 9.4.1 一维数组作业
-
定义一个长度为10的字符串数组。循环输入10个姓名。然后再使用循环输出这10个学生的姓名。
-
定义一个长度为10的整型数组,循环输入10个整数,然后再使用循环查找出此数组中的最大及最小值。
-
定义一个长度为5的数组为{‘a’,‘b’,‘c’,‘d’,‘e’}的数据值,复制到另外一个数组。
-
定义一个长度为3的数组值为{1,2,3},另外一个数组值为{4,5}合并成一新的数组.
-
声明一个字符串的数组,空间为5个。使用循环接收五个学生的姓名。再使用循环输出这五个学生的姓名。
-
声明一个int型的数组,循环接收8个学生的成绩,计算这8个学生的总分及平均分。
-
声明一个int型的数组,循环随机生成13个1到13之间随机数放入到此数组中去,再循环输出。
-
声明一个String型的数组,长度为4,循环输入4个字符串,然后并接起来打印输出。
-
在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉一个最低分,然后剩余的8位评委的分数进行平均,就是该选手的最终得分。如果已知每个评委的评分,求该选手的得分。
-
循环输入10个整数放入到一个整形的数组中,然后再循环数组中的数,统计有多少个数大于0。
-
定义一个长度为6的char型数组。初始化为{‘我’,‘爱’,‘你’,‘,’,‘小’,‘样’}。最后输出。
-
定义一个数组:int a[]={4,5,3,2,8},将该数组中所有的偶数复制到新数组中。
-
定义一个长度为5的字符串的数组,输入5个同学的姓名,删除其中的一个,然后循环输出来。
-
定义一个长度为6的整型数组,数据为{1,2,4,5,6,0}插入一个数字3,使数组依然有序。
-
定义一个长度为6的整型数组,输入数据,然后排序(从大到小)
-
实现寝室管理系统:空间为8个, 开始已经有2个。
1. 添加 2. 显示 3. 查询 4. 修改 5. 删除(思考)
-
使用数组思想,实现双色球摇号与中奖匹配系统。中奖规则如下:
一等奖:单注奖金固定为1000万。 二等奖:单注奖金固定为500万。 三等奖:单注奖金固定为3000元。 四等奖:单注奖金固定为200元。 五等奖:单注奖金固定为10元。 六等奖:单注奖金固定为5元。 注意:一、二等奖实际上跟奖池和中奖人数有关!!!这里不做深究,按照固定中奖奖金计算。 一等奖(6+1)投注号码与当期开奖号码全部相同(顺序不限,下同),即中奖;红球33选6乘以蓝球16选1; 二等奖(6+0)投注号码与当期开奖号码中的6个红色球号码相同,即中奖;红球33选6乘以蓝球16选0; 三等奖(5+1)投注号码与当期开奖号码中的任意5个红色球号码和1个蓝色球号码相同,即中奖;红球33选5乘以蓝球16选1; 四等奖(5+0、4+1)投注号码与当期开奖号码中的任意5个红色球号码相同,或与任意4个红色球号码和1个蓝色球号码相同,即中奖;红球33选5乘以蓝球16选0; 五等奖(4+0、3+1)投注号码与当期开奖号码中的任意4个红色球号码相同,或与任意3个红色球号码和1个蓝色球号码相同,即中奖;红球33选4乘以蓝球16选0; 六等奖(2+1、1+1、0+1)投注号码与当期开奖号码中的1个蓝色球号码相同,即中奖;红球33选2乘以蓝球16选1。
-
- 9.4.2 二维数组作业
-
定义一个二维数组,int[4][3],要求是循环输入12个整数,放入到数组中,然后使用嵌套循环找到这个数组中的偶数,并且求和输出。
-
定义一个二维数组,int[3][4],要求是循环输入12个整数,放入到数组中,然后使用嵌套循环找到这个数组中的最大值。
-
定义一个二维数组,用来记录3个学生的java,c#,sql三门功课的成绩,二维数组的一行记录一个人的成绩,要求循环输入,最后输出格式如下:
java c# sql html 第1名学生 89 79 98 90 第2名学生 99 80 100 98 第3名学生 79 99 87 87
-
(挑战题)使用二维数组完成:要求使用循环。
1 0 0 0 0 1 1 0 0 0 1 2 1 0 0 1 3 3 1 0 1 4 6 4 1 .......
-
(思考题)使用控制台制作推箱子游戏。
-