第九章_数组

第九章 数组


提纲

  • 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 一维数组作业
    1. 定义一个长度为10的字符串数组。循环输入10个姓名。然后再使用循环输出这10个学生的姓名。

    2. 定义一个长度为10的整型数组,循环输入10个整数,然后再使用循环查找出此数组中的最大及最小值。

    3. 定义一个长度为5的数组为{‘a’,‘b’,‘c’,‘d’,‘e’}的数据值,复制到另外一个数组。

    4. 定义一个长度为3的数组值为{1,2,3},另外一个数组值为{4,5}合并成一新的数组.

    5. 声明一个字符串的数组,空间为5个。使用循环接收五个学生的姓名。再使用循环输出这五个学生的姓名。

    6. 声明一个int型的数组,循环接收8个学生的成绩,计算这8个学生的总分及平均分。

    7. 声明一个int型的数组,循环随机生成13个1到13之间随机数放入到此数组中去,再循环输出。

    8. 声明一个String型的数组,长度为4,循环输入4个字符串,然后并接起来打印输出。

    9. 在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉一个最低分,然后剩余的8位评委的分数进行平均,就是该选手的最终得分。如果已知每个评委的评分,求该选手的得分。

    10. 循环输入10个整数放入到一个整形的数组中,然后再循环数组中的数,统计有多少个数大于0。

    11. 定义一个长度为6的char型数组。初始化为{‘我’,‘爱’,‘你’,‘,’,‘小’,‘样’}。最后输出。

    12. 定义一个数组:int a[]={4,5,3,2,8},将该数组中所有的偶数复制到新数组中。

    13. 定义一个长度为5的字符串的数组,输入5个同学的姓名,删除其中的一个,然后循环输出来。

    14. 定义一个长度为6的整型数组,数据为{1,2,4,5,6,0}插入一个数字3,使数组依然有序。

    15. 定义一个长度为6的整型数组,输入数据,然后排序(从大到小)

    16. 实现寝室管理系统:空间为8个, 开始已经有2个。

      1. 添加
      2. 显示
      3. 查询
      4. 修改
      5. 删除(思考)
      
    17. 使用数组思想,实现双色球摇号与中奖匹配系统。中奖规则如下:

      一等奖:单注奖金固定为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 二维数组作业
    1. 定义一个二维数组,int[4][3],要求是循环输入12个整数,放入到数组中,然后使用嵌套循环找到这个数组中的偶数,并且求和输出。

    2. 定义一个二维数组,int[3][4],要求是循环输入12个整数,放入到数组中,然后使用嵌套循环找到这个数组中的最大值。

    3. 定义一个二维数组,用来记录3个学生的java,c#,sql三门功课的成绩,二维数组的一行记录一个人的成绩,要求循环输入,最后输出格式如下:

       		  java c#  sql  html
       第1名学生	89	79	98    90
       第2名学生	99	80	100   98
       第3名学生	79	99	87    87
      
    4. (挑战题)使用二维数组完成:要求使用循环。

       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
       .......
      
    5. (思考题)使用控制台制作推箱子游戏。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值