zoukankan      html  css  js  c++  java
  • JavaSE学习笔记(五)—— 数组

    一、数组概述

      需求:现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦。为了解决这种问题,Java就提供了数组供我们使用。
      那么数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:
      数组是存储多个变量(元素)的东西(容器);
      这多个变量的数据类型要一致。

      所以,数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。数组既可以存储基本数据类型,也可以存储引用数据类型。

    二、数组的格式定义

    【格式一】——数据类型[] 数组名;(推荐)

      比如:int[] a;   定义一个int类型的数组a变量

    【格式二】——数据类型 数组名[];

      比如:int a[];   定义一个int类型的a数组变量

      注意:效果可以认为是一样的,都是定义一个int数组,但是念法上有些小区别。推荐使用第一种。

    三、数组的初始化

      Java中的数组必须先初始化,然后才能使用。
      所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

      初始化有两种方式:动态初始化和静态初始化。

    3.1 动态初始化

      动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

    【格式】

      数据类型[] 数组名 = new 数据类型[数组长度];

    //定义了一个int类型的数组,这个数组中可以存放3个int类型的值
    int[] arr = new int[3];    

    【获取数组中的元素】

      可以通过:数组名[索引]
      索引其实就是每个元素的编号,从0开始,最大索引是数组的长度-1。

    public class ArrayDemo {
        public static void main(String[] args) {
            //定义一个数组
            //int[] a;
            //可能尚未初始化变量a
            //System.out.println(a);
            
            int[] arr = new int[3];
            /*
                左边:
                    int:说明数组中的元素的数据类型是int类型
                    []:说明这是一个数组
                    arr:是数组的名称
                    
                右边:
                    new:为数组分配内存空间。
                    int:说明数组中的元素的数据类型是int类型
                    []:说明这是一个数组
                    3:数组长度,其实也就是数组中元素的个数
            */
            
            System.out.println(arr); //[I@175078b 地址值。
            //我要地址值没有意义啊,我就要数据值,怎么办呢?
            //不用担心,java为你考虑到了。
            //其实数组中的每个元素都是有编号的,并且是从0开始。最大编号是数组的长度-1。
            //用数组名和编号的配合就可以获取数组中的指定编号的元素。这个编号的专业叫法:索引
            //通过数组名访问数据的格式是:数组名[索引];
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println(arr[2]);
        }
    }

     【Java中的内存分配】

    【Java中数组的内存图解】

      图解1:定义一个数组,输出该数组的名称和数组元素值。给数组元素赋值,再次输出该数组的名称和数组元素值。

    public class ArrayDemo2 {
        public static void main(String[] args) {
            //定义一个数组
            int[] arr = new int[3];
            
            //输出数组名称
            System.out.println(arr);
            //输出数组元素值
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println(arr[2]);
            System.out.println("----");
            
            //给数组元素赋值
            arr[0] = 100;
            arr[2] = 200;
            
            //输出数组名称
            System.out.println(arr);
            //输出数组元素值
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println(arr[2]);
        }
    }

      图解二:定义两个数组,分别输出两个数组各自的数组名及元素值。然后给每个数组的元素重新赋值,再次分别输出两个数组各自的数组名及元素值。

    public class ArrayDemo3 {
        public static void main(String[] args) {
            //定义第一个数组
            int[] arr = new int[2];
            //定义第二个数组
            int[] arr2 = new int[3];
            
            //输出数组名和元素值
            System.out.println(arr);
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println("----");
            
            System.out.println(arr2);
            System.out.println(arr2[0]);
            System.out.println(arr2[1]);
            System.out.println(arr2[2]);
            System.out.println("----");
            
            //给元素重新赋值
            arr[1] = 20;
            
            arr2[1] = 30;
            arr2[0] = 40;
            
            //输出数组名和元素值
            System.out.println(arr);
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println("----");
            
            System.out.println(arr2);
            System.out.println(arr2[0]);
            System.out.println(arr2[1]);
            System.out.println(arr2[2]);
        }
    }

     

      图解3:

      定义第一个数组,定义完毕后,给数组元素赋值。赋值完毕后,在输出数组名称和元素。
      定义第二个数组,定义完毕后,给数组元素赋值。赋值完毕后,在输出数组名称和元素。
      定义第三个数组,把第一个数组的地址值赋值给它。(注意类型一致),通过第三个数组的名称去把元素重复赋值。
      最后,再次输出第一个数组数组名称和元素。

    public class ArrayDemo4 {
        public static void main(String[] args) {
            //定义第一个数组
            int[] arr = new int[3];
            arr[0] = 88;
            arr[1] = 33;
            arr[2] = 66;
            System.out.println(arr);
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println(arr[2]);
            System.out.println("----");
            
            //定义第二个数组
            int[] arr2 = new int[3];
            arr2[0] = 22;
            arr2[1] = 44;
            arr2[2] = 55;
            System.out.println(arr2);
            System.out.println(arr2[0]);
            System.out.println(arr2[1]);
            System.out.println(arr2[2]);
            System.out.println("----");
            
            //定义第三个数组
            int[] arr3 =  arr;
            arr3[0] = 100;
            arr3[1] = 200;
            System.out.println(arr);
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println(arr[2]);
        }
    }

    3.2 静态初始化

      静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

    【格式】

       数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};

    //定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。
    int[] arr = new int[]{1,2,3};

    【简化格式】——常用

      数据类型[] 数组名 = {元素1,元素2,…};

    int[] arr = {1,2,3};

    【注意事项】

      不要同时动态和静态进行。如下格式:

    int[] arr = new int[3]{1,2,3}; //错误

    【常见问题】

    •  ArrayIndexOutOfBoundsException:数组索引越界异常。
      原因:你访问了不存在的索引。
    • NullPointerException:空指针异常。
      原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。

    四、数组常见操作

    4.1 数组遍历

      数组遍历:就是依次输出数组中的每一个元素。 

    public class ArrayTest {
        public static void main(String[] args) {
            //定义数组
            int[] arr = {11,22,33,44,55};
            
            //获取每一个元素
            //如何获取呢?我们知道数组名结合编号(索引)就可以找到数据
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println(arr[2]);
            System.out.println(arr[3]);
            System.out.println(arr[4]);
            System.out.println("--------------------");
            
            //虽然这种做法可以,但是不是我想要的
            //我们发现,代码的重复度很高
            //输出语句,数组名都是相同的,仅仅是索引是变化的
            //我们就可以使用循环搞定索引值
            for(int x=0; x<5; x++) {
                //x=0,1,2,3,4
                System.out.println(arr[x]);
            }
            System.out.println("--------------------");
            
            //从0开始我们是明确的,但是为什么到5呢,我们是数了一下数组的个数
            //继续看下个数组如何遍历
            int[] arr2 = {1,2,3,4,5,6,7,8,9,10,11,25,3,5,6,8,5,3,5,6,8,7,8,5,3,5,6,8};
            //而我们在很多时候,数组的元素不能靠数
            //这个时候,数组就给我们提供了一个属性:length专门用于获取数组的长度
            //格式:数组名.length 返回数组的长度
            System.out.println(arr.length);
            System.out.println(arr2.length);
            System.out.println("--------------------");
            
            //改进第一个程序
            for(int x=0; x<arr.length; x++) {
                System.out.println(arr[x]);
            }
            System.out.println("--------------------");
            
            //我们如果想要对多个数组进行遍历,每个数组的遍历我们都把代码写一遍,麻烦不
            //麻烦,所以,我们准备用方法改进。
            //用方法改进后,请调用
            printArray(arr);
            System.out.println("--------------------");
            printArray(arr2);
            System.out.println("--------------------");
            printArray2(arr);
        }
        
        /*
            遍历数组的方法
            
            两个明确:
                返回值类型:void
                参数列表:int[] arr
        */
        public static void printArray(int[] arr) {
            for(int x=0; x<arr.length; x++) {
                System.out.println(arr[x]);
            }
        }
        
        //请看改进版本
        public static void printArray2(int[] arr) {
            System.out.print("[");
            for(int x=0; x<arr.length; x++) {
                if(x == arr.length-1) { //这是最后一个元素
                    System.out.println(arr[x]+"]");
                }else {
                    System.out.print(arr[x]+", ");
                }
            }
        }
    }

      注意:数组提供了一个属性length,用于获取数组的长度。

    4.2 数组获取最值

    /*
        分析:
            A:定义一个数组,并对数组的元素进行静态初始化。
            B:从数组中任意的找一个元素作为参照物(一般取第一个),默认它就是最大值。
            C:然后遍历其他的元素,依次获取和参照物进行比较,如果大就留下来,如果小,就离开。
            D:最后参照物里面保存的就是最大值。
    */
    public class ArrayTest2 {
        public static void main(String[] args) {
            //定义一个数组
            int[] arr = {34,98,10,25,67};
            
            //请获取数组中的最大值
            /*
            //从数组中任意的找一个元素作为参照物
            int max = arr[0];
            //然后遍历其他的元素
            for(int x=1; x<arr.length; x++) {
                //依次获取和参照物进行比较,如果大就留下来,如果小,就离开。
                if(arr[x] > max) {
                    max = arr[x];
                }
            }
            //最后参照物里面保存的就是最大值。
            System.out.println("max:"+max);
            */
        
            //把这个代码用方法改进
            //调用方法
            int max = getMax(arr);
            System.out.println("max:"+max);
                
            //请获取数组中的最小值
            int min = getMin(arr);
            System.out.println("min:"+min);
        }
        
        /*
            需求:获取数组中的最大值
            两个明确:
                返回值类型:int
                参数列表:int[] arr
        */
        public static int getMax(int[] arr) {
            //从数组中任意的找一个元素作为参照物
            int max = arr[0];
            //然后遍历其他的元素
            for(int x=1; x<arr.length; x++) {
                //依次获取和参照物进行比较,如果大就留下来,如果小,就离开。
                if(arr[x] > max) {
                    max = arr[x];
                }
            }
            //最后参照物里面保存的就是最大值。
            return max;
        }
        
        public static int getMin(int[] arr) {
            //从数组中任意的找一个元素作为参照物
            int min = arr[0];
            //然后遍历其他的元素
            for(int x=1; x<arr.length; x++) {
                //依次获取和参照物进行比较,如果小就留下来,如果大,就离开。
                if(arr[x] < min) {
                    min = arr[x];
                }
            }
            //最后参照物里面保存的就是最小值。
            return min;
        }
    }

    4.3 数组元素逆序

    /*
        分析:
            A:定义一个数组,并进行静态初始化。
            B:思路
                把0索引和arr.length-1的数据交换
                把1索引和arr.length-2的数据交换
                ...
                只要做到arr.length/2的时候即可。
    */
    public class ArrayTest3 {
        public static void main(String[] args) {
            //定义一个数组,并进行静态初始化。
            int[] arr = {12,98,50,34,76};
            
            //逆序前
            System.out.println("逆序前:");
            printArray(arr);
            
            //逆序后
            System.out.println("逆序后:");
            //reverse(arr);
            reverse2(arr);
            printArray(arr);
        }
        
        /*
            需求:数组逆序
            两个明确:
                返回值类型:void (有人会想到应该返回的是逆序后的数组,但是没必要,因为这两个数组其实是同一个数组)
                参数列表:int[] arr
        */
        public static void reverse(int[] arr) {
            /*
            //第一次交换
            int temp = arr[0];
            arr[0] = arr[arr.length-1-0];
            arr[arr.length-1-0] = temp;
            
            //第二次交换
            int temp = arr[1];
            arr[1] = arr[arr.length-1-1];
            arr[arr.length-1-1] = temp;
            
            //第三次交换
            int temp = arr[2];
            arr[2] = arr[arr.length-1-2];
            arr[arr.length-1-2] = temp;
            */
            //用循环改进
            for(int x=0; x<arr.length/2; x++) {
                int temp = arr[x];
                arr[x] = arr[arr.length-1-x];
                arr[arr.length-1-x] = temp;
            }
        }
        
        public static void reverse2(int[] arr) {
            for(int start=0,end=arr.length-1; start<=end; start++,end--) {
                int temp = arr[start];
                arr[start] = arr[end];
                arr[end] = temp;
            }
        }
        
        //遍历数组
        public static void printArray(int[] arr) {
            System.out.print("[");
            for(int x=0; x<arr.length; x++) {
                if(x == arr.length-1) { //这是最后一个元素
                    System.out.println(arr[x]+"]");
                }else {
                    System.out.print(arr[x]+", ");
                }
            }
        }
    }

    4.4 数组查表法

      根据键盘录入索引,查找对应星期

    public class ArrayTest4 {
        public static void main(String[] args) {
            //定义一个字符串数组
            String[] strArray = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
            
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            System.out.println("请输入一个数据(0-6):");
            int index = sc.nextInt();
            
            System.out.println("你要查找的日期是:"+strArray[index]);
        }
    }

    4.5 数组元素查找

      查找指定元素第一次在数组中出现的索引

    /*
        分析:
            A:定义一个数组,并静态初始化。
            B:写一个功能实现
                遍历数组,依次获取数组中的每一个元素,和已知的数据进行比较
                如果相等,就返回当前的索引值。
    */
    public class ArrayTest5 {
        public static void main(String[] args) {
            //定义一个数组,并静态初始化
            int[] arr = {200,250,38,888,444};
            
            //需求:我要查找250在这个数组中第一次出现的索引
            int index = getIndex(arr,250);
            System.out.println("250在数组中第一次出现的索引是:"+index);
            
            int index2 = getIndex2(arr,250);
            System.out.println("250在数组中第一次出现的索引是:"+index2);
            
            int index3 = getIndex2(arr,2500);
            System.out.println("2500在数组中第一次出现的索引是:"+index3);
        }
        
        /*
            需求:查找指定数据在数组中第一次出现的索引
            两个明确:
                返回值类型:int
                参数列表:int[] arr,int value
        */
        public static int getIndex(int[] arr,int value) {
            //遍历数组,依次获取数组中的每一个元素,和已知的数据进行比较
            for(int x=0; x<arr.length; x++) {
                if(arr[x] == value) {
                    //如果相等,就返回当前的索引值。
                    return x;
                }
            }
            
            //目前的代码有一个小问题
            //就是假如我要查找的数据在数组中不存在,那就找不到,找不到,你有对应的返回吗?
            //所以报错。
            
            //只要是判断,就可能是false,所以要细心。
            
            
            //如果找不到数据,我们一般返回一个负数即可,而且是返回-1
            return -1;
        }
        
        public static int getIndex2(int[] arr,int value) {
            //定义一个索引
            int index = -1;
            
            //有就修改索引值
            for(int x=0; x<arr.length; x++) {
                if(arr[x] == value) {
                    index = x;
                    break;
                }
            }
            
            //返回index
            return index;
        }
    }

    五、二维数组

    5.1 二位数组概述

      一个班有很多个学生,所以,可以用数组来存储,而一个年级又有很多个班级。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。

      由此可见:其实二维数组其实就是一个元素为一维数组的数组。

    5.2 二维数组的格式

    【格式1】

      数据类型[][] 数组名 = new 数据类型[m][n];

      m:表示这个二维数组有多少个一维数组。

      n:表示每一个一维数组的元素有多少个。

    //定义一个二维数组
    //这个二维数组有3个一维数组的元素
    //每一个一维数组有2个元素
    int[][] arr = new int[3][2];

      注意:

    • 以下格式也可以表示二维数组
      a:数据类型 数组名[][] = new 数据类型[m][n];
      
      b:数据类型[] 数组名[] = new 数据类型[m][n];
    • 注意下面定义的区别
      int x,y;//等同于int x;int y;
      
      int[] x,y[];//等同于int[] x;int[] y[];

      示例:

    class Array2Demo {
        public static void main(String[] args) {
             //定义一个二维数组
             int[][] arr = new int[3][2];
             //定义了一个二维数组arr
             //这个二维数组有3个一维数组的元素
             //每一个一维数组有2个元素
             //输出二维数组名称
             System.out.println(arr); //地址值    [[I@175078b
             //输出二维数组的第一个元素一维数组的名称
             System.out.println(arr[0]); //地址值    [I@42552c
             System.out.println(arr[1]); //地址值    [I@e5bbd6
             System.out.println(arr[2]); //地址值    [I@8ee016
             //输出二维数组的元素
             System.out.println(arr[0][0]); //0
             System.out.println(arr[0][1]); //0
        }
    }

    【格式2】

      数据类型[][] 数组名 = new 数据类型[m][];

      m:表示这个二维数组有多少个一维数组。

      列数没有给出,可以动态的给。这一次是一个变化的列数。

    class Array2Demo2 {
        public static void main(String[] args) {
            //定义数组
            int[][] arr = new int[3][];
            
            System.out.println(arr);    //[[I@175078b
            System.out.println(arr[0]); //null
            System.out.println(arr[1]); //null
            System.out.println(arr[2]); //null
            
            //动态的为每一个一维数组分配空间
            arr[0] = new int[2];
            arr[1] = new int[3];
            arr[2] = new int[1];
            
            System.out.println(arr[0]); //[I@42552c
            System.out.println(arr[1]); //[I@e5bbd6
            System.out.println(arr[2]); //[I@8ee016
            
            System.out.println(arr[0][0]); //0
            System.out.println(arr[0][1]); //0
            //ArrayIndexOutOfBoundsException
            //System.out.println(arr[0][2]); //错误
            
            arr[1][0] = 100;
            arr[1][2] = 200;
        }
    }

    【格式3】

    • 基本格式:数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
    • 简化版格式:数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
      int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
      int[][] arr = {{1,2,3},{4,5},{6}};

      示例:

    class Array2Demo3 {
        public static void main(String[] args) {
            //定义数组
            int[][] arr = {{1,2,3},{4,5},{6}};
            
            System.out.println(arr);
            System.out.println(arr[0]);
            System.out.println(arr[1]);
            System.out.println(arr[2]);
            
            System.out.println(arr[0][0]); //1
            System.out.println(arr[1][0]); //4
            System.out.println(arr[2][0]); //6
            
            System.out.println(arr[0][1]); //2
            System.out.println(arr[1][1]); //5
            //越界
            System.out.println(arr[2][1]); //错误
        }
    }

    5.3 二维数组练习

    【二维数组遍历】

    /*
        外循环控制的是二维数组的长度,其实就是一维数组的个数。
        内循环控制的是一维数组的长度。
    */
    class Array2Test {
        public static void main(String[] args) {
            //定义一个二维数组
            int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
            
            //请问谁代表{1,2,3}
            //arr[0]就是第一个数组
            //arr[0] = {1,2,3};
            for(int x=0; x<arr[0].length; x++) {
                System.out.println(arr[0][x]);
            }
            System.out.println("--------------");
            
            for(int x=0; x<arr[1].length; x++) {
                System.out.println(arr[1][x]);
            }
            System.out.println("--------------");
            
            for(int x=0; x<arr[2].length; x++) {
                System.out.println(arr[2][x]);
            }
            System.out.println("--------------");
            
            //用循环改进
            for(int x=0; x<3; x++) {
                for(int y=0; y<arr[x].length; y++) {
                    System.out.print(arr[x][y]+" ");
                }
                System.out.println();
            }
            System.out.println("--------------");
            
            //这个时候,注意了,3是我们根据上面的代码得出来的
            //但是,它不能针对任何的数组都可以这样
            //所以,我们应该想办法改进
            //其实,外面的这个循环的长度就是二维数组的长度
            
            for(int x=0; x<arr.length; x++) {
                for(int y=0; y<arr[x].length; y++) {
                    System.out.print(arr[x][y]+" ");
                }
                System.out.println();
            }
            System.out.println("--------------");
            
            //用方法改进
            //调用方法
            printArray2(arr);
            System.out.println("--------------");
            
            //我们再来一个列数是变化的
            int[][] arr2 = {{1,2,3},{4,5},{6}};
            printArray2(arr2);
        }
        
        /*
            需求:遍历二维数组
            两个明确:
                返回值类型:void
                参数列表:int[][] arr
        */
        public static void printArray2(int[][] arr) {
            for(int x=0; x<arr.length; x++) {
                for(int y=0; y<arr[x].length; y++) {
                    System.out.print(arr[x][y]+" ");
                }
                System.out.println();
            }
        }
    }

    【公司年销售额求和】

      某公司按照季度和月份统计的数据如下:单位(万元)
      第一季度:22,66,44
      第二季度:77,33,88
      第三季度:25,45,65
      第四季度:11,66,99

    /*
        分析:
            A:把题目的数据用二维数组来表示
                int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
            B:如何求和呢?
                求和其实就是获取到每一个元素,然后累加即可。
            C:定义一个求和变量sum,初始化值是0。
            D:通过遍历就可以得到每一个二维数组的元素。
            E:把元素累加即可。
            F:最后输出sum,就是结果。
    */
    class Array2Test2 {
        public static void main(String[] args) {
            //把题目的数据用二维数组来表示
            int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
            
            //定义一个求和变量sum,初始化值是0。
            int sum = 0;
            
            //通过遍历就可以得到每一个二维数组的元素。
            for(int x=0; x<arr.length; x++) {
                for(int y=0; y<arr[x].length; y++) {
                    //把元素累加即可。
                    sum += arr[x][y];
                }
            }
            
            //最后输出sum,就是结果。
            System.out.println("一年的销售额为:"+sum+"万元");
        }
    }

    【打印杨辉三角形】——行数可以键盘录入

      1
      1 1
      1 2 1
      1 3 3 1
      1 4 6 4 1
      1 5 10 10 5 1

    /*
        分析:看这种图像的规律
            A:任何一行的第一列和最后一列都是1
            B:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
        
        步骤:
            A:首先定义一个二维数组。行数如果是n,我们把列数也先定义为n。
              这个n的数据来自于键盘录入。
            B:给这个二维数组任何一行的第一列和最后一列赋值为1
            C:按照规律给其他元素赋值
                从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
            D:遍历这个二维数组。
    */
    import java.util.Scanner;
    
    class Array2Test3 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //这个n的数据来自于键盘录入。
            System.out.println("请输入一个数据:");
            int n = sc.nextInt();
            
            //定义二维数组
            int[][] arr = new int[n][n];
            
            //给这个二维数组任何一行的第一列和最后一列赋值为1
            for(int x=0; x<arr.length; x++) {
                arr[x][0] = 1; //任何一行第1列
                arr[x][x] = 1; //任何一行的最后1列
            }
            
            //按照规律给其他元素赋值
            //从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
            for(int x=2; x<arr.length; x++) {
                //这里如果y<=x是有个小问题的,就是最后一列的问题
                //所以这里要减去1
                //并且y也应该从1开始,因为第一列也是有值了
                for(int y=1; y<=x-1; y++) {
                    //每一个数据是它上一行的前一列和它上一行的本列之和。
                    arr[x][y] = arr[x-1][y-1] + arr[x-1][y];
                }
            }
            
            //遍历这个二维数组。
            /*
            for(int x=0; x<arr.length; x++) {
                for(int y=0; y<arr[x].length; y++) {
                    System.out.print(arr[x][y]+"	");
                }
                System.out.println();
            }
            */
            //这个时候,要注意了,内循环的变化必须和曾经讲过的九九乘法表类似
            for(int x=0; x<arr.length; x++) {
                for(int y=0; y<=x; y++) {
                    System.out.print(arr[x][y]+"	");
                }
                System.out.println();
            }
        }
    }

    六、数组的综合练习

    6.1 看程序写结果

    class ArgsDemo {
        public static void main(String[] args) {
            int a = 10;
            int b = 20;
            System.out.println("a:"+a+",b:"+b); //a:10,b:20
            change(a,b);
            System.out.println("a:"+a+",b:"+b); //???    a:10,b:20
    
            int[] arr = {1,2,3,4,5}; 
            change(arr);
            System.out.println(arr[1]); //???    4
        }
    
        public static void change(int a,int b) { //a=10,b=20
            System.out.println("a:"+a+",b:"+b); //a:10,b:20
            a = b;    //a=20
            b = a + b; //b=40
            System.out.println("a:"+a+",b:"+b); //a:20,b:40
        }
    
        public static void change(int[] arr) { //arr={1,2,3,4,5};
            for(int x=0; x<arr.length; x++) {
                if(arr[x]%2==0) {
                    arr[x]*=2;
                }
            }
            //arr={1,4,3,8,5};
        }
    }

    Java中的参数传递问题:

    • 基本类型:形式参数的改变对实际参数没有影响。
    • 引用类型:形式参数的改变直接影响实际参数。

    6.2 数据加密问题

      某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:
      首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来。

    /*
        题目要求:
            A:数据是小于8位的整数
                定义一个int类型的数据
                int number = 123456;
            B:加密规则
                a:首先将数据倒序
                    结果 654321
                b:然后将每位数字都加上5,再用和除以10的余数代替该数字
                    结果 109876
                c:最后将第一位和最后一位数字交换
                    结果 609871
            C:把加密后的结果输出在控制台
            
            通过简单的分析,我们知道如果我们有办法把这个数据变成数组就好了。
            不是直接写成这个样子的:
                int[] arr = {1,2,3,4,5,6};
                
            如何把数据转成数组呢?
                A:定义一个数据
                    int number = 123456;
                B:定义一个数组,这个时候问题就来了,数组的长度是多少呢?
                    int[] arr = new int[8]; //不可能超过8
                    在赋值的时候,我用一个变量记录索引的变化。
                    定义一个索引值是0
                    int index = 0;
                C:获取每一个数据
                    int ge = number%10
                    int shi = number/10%10
                    int bai = number/10/10%10
                    
                    arr[index] = ge;
                    index++;
                    arr[index] = shi;
                    index++;
                    arr[index] = bai;
                    ...
    */
    class JiaMiDemo {
        public static void main(String[] args) {
            //定义一个数据
            int number = 123456;
            
            //定义一个数组
            int[] arr = new int[8];
            
            //把数据中每一位上的数据获取到后存储到数组中
            /*
            int index = 0;
            arr[index] = number%10; //arr[0]=6;
            index++;
            arr[index] = number/10%10; //arr[1]=5;
            index++;
            arr[index] = mumber/10/10%10; //arr[2]=4;
            */
            
            //通过观察这个代码,我们发现应该是可以通过循环改进的
            int index = 0;
            
            while(number > 0) { //number=123456,number=12345,number=1234,number=123,number=12,number=1,number=0
                arr[index] = number%10; //arr[0]=6,arr[1]=5,arr[2]=4,arr[3]=3,arr[4]=2,arr[5]=1
                index++;//index=1,index=2,index=3,index=4,index=5,index=6
                number/=10;//number=12345,number=1234,number=123,number=12,number=1,number=0
            }
            
            //然后将每位数字都加上5,再用和除以10的余数代替该数字
            for(int x=0; x<index; x++) {
                arr[x] += 5;
                arr[x] %= 10;
            }
            
            //最后将第一位和最后一位数字交换
            int temp = arr[0];
            arr[0] = arr[index-1];
            arr[index-1] = temp;
            
            //输出数据
            for(int x=0; x<index; x++) {
                System.out.print(arr[x]);
            }
            System.out.println();
        }
    }

      把上面的代码改进一下:

      A:把数据改进为键盘录入

      B:把代码改进为方法实现

    class JiaMiDemo2 {
        public static void main(String[] args) {
            //创建键盘录入对象
            Scanner sc = new Scanner(System.in);
            
            //请输入一个数据
            System.out.println("请输入一个数据(小于8位):");
            int number = sc.nextInt();
            
            //写功能实现把number进行加密
            //调用
            String result = jiaMi(number);
            System.out.println("加密后的结果是:"+result);
        }
        
        /*
            需求:写一个功能,把数据number实现加密。
            两个明确:
                返回值类型:String 做一个字符串的拼接。
                参数列表:int number
        */
        public static String jiaMi(int number) {
            //定义数组
            int[] arr = new int[8];
            
            //定义索引
            int index = 0;
            
            //把number中的数据想办法放到数组中
            while(number > 0) {
                arr[index] = number%10;
                index++;
                number /= 10;
            }
            
            //把每个数据加5,然后对10取得余数
            for(int x=0; x<index; x++) {
                arr[x] += 5;
                arr[x] %= 10;
            }
            
            //把第一位和最后一位交换
            int temp = arr[0];
            arr[0] = arr[index-1];
            arr[index-1] = temp;
            
            //把数组的元素拼接成一个字符串返回
            //定义一个空内容字符串
            String s = "";
            
            for(int x=0; x<index; x++) {
                s += arr[x];
            }
            
            return s;
        }
    }

    七、对象数组

      需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息。

        学生:Student
        成员变量:name,age
        构造方法:无参,带参
        成员方法:getXxx()/setXxx()
        存储学生的数组?自己想想应该是什么样子的?

    /*
     * 分析:
     *         A:创建学生类。
     *         B:创建学生数组(对象数组)。
     *         C:创建5个学生对象,并赋值。
     *         D:把C步骤的元素,放到数组中。
     *         E:遍历学生数组。
     */
    public class ObjectArrayDemo {
        public static void main(String[] args) {
            // 创建学生数组(对象数组)。
            Student[] students = new Student[5];
            // for (int x = 0; x < students.length; x++) {
            // System.out.println(students[x]);
            // }
            // System.out.println("---------------------");
    
            // 创建5个学生对象,并赋值。
            Student s1 = new Student("林青霞", 27);
            Student s2 = new Student("风清扬", 30);
            Student s3 = new Student("刘意", 30);
            Student s4 = new Student("赵雅芝", 60);
            Student s5 = new Student("王力宏", 35);
    
            // 把C步骤的元素,放到数组中。
            students[0] = s1;
            students[1] = s2;
            students[2] = s3;
            students[3] = s4;
            students[4] = s5;
    
            // 看到很相似,就想循环改
            // for (int x = 0; x < students.length; x++) {
            // students[x] = s + "" + (x + 1);
            // }
            // 这个是有问题的
    
            // 遍历
            for (int x = 0; x < students.length; x++) {
                //System.out.println(students[x]);
                
                Student s = students[x];
                System.out.println(s.getName()+"---"+s.getAge());
            }
        }
    }

      Student.java

    public class Student {
        // 成员变量
        private String name;
        private int age;
    
        // 构造方法
        public Student() {
            super();
        }
    
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        // 成员方法
        // getXxx()/setXxx()
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + "]";
        }
    }

    【对象数组的内存图解】

  • 相关阅读:
    Sum Root to Leaf Numbers 解答
    459. Repeated Substring Pattern
    71. Simplify Path
    89. Gray Code
    73. Set Matrix Zeroes
    297. Serialize and Deserialize Binary Tree
    449. Serialize and Deserialize BST
    451. Sort Characters By Frequency
    165. Compare Version Numbers
    447. Number of Boomerangs
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10803297.html
Copyright © 2011-2022 走看看