1.二维数组概述

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

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


2.二维数组之定义格式一

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

    m表示这个二维数组有多少个一维数组,n表示每一个一维数组的元素个数。

    例如:

        int[][] arr = new int[3][2];

        定义了一个二维数组arr,这个二维数组有3个一维数组,名称是arr[0],ar[1],arr[2],每一个一维数组有2个元素,可以通过arr[m][n]来获取。

/**
 *
 */
public class Array2Demo {
    public static void main(String[] args){
        //定义了一个二维数组
        int[][] arr = new int[3][2];
        //这个二维数组有3个一维数组元素
        //每个一维数组有2个元素
        //输出二维数组的名称
        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]);
        //输出二维数组的第二个元素
        System.out.println(arr[0][1]);
    }
}
[[I@1b6d3586
[I@4554617c
[I@74a14482
[I@1540e19d

wKioL1flH7STVDfhAACV9ZxUlEM515.png

3.二维数组之定义格式二

    数据类型[][] 变量名 = new 数据类型[m][];

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

    没有直接给出一维数组的个数,可以动态的给出。

    例如:

        int[][] arr = new int[3][];

        arr[0] = new int[2];

        arr[1] = new int[3];

        arr[2] = new int[1];

wKiom1flIqHRGGi8AAEQO8FredE021.png


4.二维数组之定义格式三

    数据类型[][] 变量名 = new 数据类型[][]{{元素...},{元素...},{元素...}}

    或者数据类型[][] 变量名 = {{元素...},元素...},{元素...}};

    例如:

        int[][] arr = new int[][]{{1,2,3},{4,5},{6}};


wKioL1flJr-j6sjYAADXbTRclNo576.png

5.练习

/**
 *  二维数组的遍历
 */
public class Array2Demo {
    public static void main(String[] args){
        //定义一个二维数组
        int[][] arr = new int[][] {{1,2,3},{4,5,6},{7,8,9}};
        //arr[0]代表了{1,2,3}
        for (int x = 0;x<arr[0].length;x++){
            System.out.println(arr[0][x]);
        }
        //arr[1]代表了{4,5,6}
        for (int x =0;x<arr[1].length;x++){
            System.out.println(arr[1][x]);
        }
        //arr[2]代表了{7,8,9}
        for (int x = 0;x<arr[2].length;x++){
            System.out.println(arr[2][x]);
        }
        //通过for循环的嵌套来输出二维数组的元素
        for (int x = 0;x<arr.length;x++){//遍历二维数组中的一维数组
            for (int y=0;y<arr[x].length;y++){//遍历二维数组中的一维数组的元素
                System.out.print(arr[x][y]+"\t");
            }
            System.out.println();
        }
    }
}
/**
 *  某公司销售额求和
 *      某公司按照季度和月份统计的数据如下,单位:万元
 *      第一季度:22 66 44
 *      第二季度:77 33 88
 *      第三季度:25 45 65
 *      第四季度:11 66 99
 *
 */
public class Array2Demo {
    public static void main(String[] args){
        int[][] arr = new int[][]{{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
        int sum = 0;
        for (int x = 0;x<arr.length;x++){
            for (int y = 0;y<arr[x].length;y++){
                sum += arr[x][y];

            }
        }
        System.out.println("销售额总和为:"+sum);

    }
}
import java.util.Scanner;

/**
 *  打印杨辉三角形
 *  1
 *  1 1
 *  1 2 1
 *  1 3 3 1
 *  1 4 6 4 1
 *  1 5 10 5 1
 *
 *  分析:
 *      1.任何一行的第一列和最后一列都是1
 *      2.从第三行开始,每一个数据是它上一行的前一列和它的上一行的本列之和
 *  步骤:
 *      1.定义一个二维数组,行数如果是n,我们把列数也定义为n
 *      2.給二维数组的任何一行的第一列和最后一列赋值为1
 *      3.按照规律,給其他元素赋值
 *      从第三行开始,每一个数据是它的上一行的前一列和它的上一行的本列之和
 *      4.遍历这个二维数组
 */
public class Array2Demo {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner input = new Scanner(System.in);

        //n这个数据是来自于键盘录入
        System.out.println("请输入一个数据:");
        int n = input.nextInt();

        //定义一个二维数组
        int[][] arr = new int[n][n];

        //給二维数组的任何一行的第一列和最后一列赋值为1
        for (int x = 0; x < arr.length; x++) {
            arr[x][0] = 1;//任何一行第一列
            arr[x][x] = 1;//任何一行最后一列
        }
        //从第三行开始,每一个数据是它的上一行的前一列和它的上一行的本列之和
        for (int x = 2;x<arr.length;x++){
            for (int y = 1;y<=x-1;y++){
                arr[x][y] = arr[x-1][y-1] + arr[x-1][y];
            }
        }
        //打印
        printYangHuiSanJiao(arr);
    }

    /**
     * 输出二维数组的每个元素
     * @param arr
     */
    public static void printYangHuiSanJiao(int[][] arr){
        for (int x = 0;x<arr.length;x++){
            for (int y = 0;y<=x;y++){
                System.out.print(arr[x][y]+"\t");
            }
            System.out.println();
        }
    }
}


6.思考题

/**
 * java中参数传递
 */
public class ArgsDemo {
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        System.out.println("a:"+a+",b:"+b);
        change(a,b);

        int[] arr= {1,2,3,4,5};
        change(arr);
        printArray(arr);
    }

    public  static void change(int a, int b) {
        System.out.println("a:"+a+",b="+b);
        a = b;
        b = a + b;
        System.out.println("a:"+a+",b="+b);
    }
    public static void change(int[] arr){
        for (int x =0;x<arr.length;x++){
            if(arr[x]%2 == 0){
                arr[x] *= 2;
            }
        }
    }
    public static void printArray(int[] arr){
        for (int x = 0;x<arr.length;x++){
            System.out.print(arr[x]+"\t");
        }
        System.out.println();
    }
}
a:10,b:20
a:10,b=20
a:20,b=40
1    4    3    8    5

wKioL1flOIDDoSZWAAEcyQFbvtM050.png

/**
 * 某公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全
 * 在传递过程中需要加密,加密规则如下:
 *  首先将数据倒序,然后将每位数组都加上5,再用和除以10的余数代替该数字,
 *  最后将第一位和最后一位数字交换。
 * 请任意给定一个小于8位的整数,然后,把加密后的结果输出到控制台上
 *
 * 题目要求:
 *  A.数据是小于8位的整数
 *      定义一个int类型的数据
 *      int number = 1232456;
 *  B.加密规则
 *      a.首先将数据倒序
 *        结果 654321
 *      b.然后将每位数字都加上1,再用和除以10的余数代替该数字
 *        结果 109876
 *      c.最后将第一位和最后一位数字交换
 *        结果 609871
 *  C.将加密后的结果输出到控制台
 *
 *  通过简单的分析,我们知道如果我们有办法把这个数据变成数据就好了。
 *
 *  那么,如何把数据转换成一个数组呢?
 *      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;
 *          ...
 *
 */
public class ArgsDemo {
    public static void main(String[] args){
        //定义一个数据
        int number = 123456;

        //定义一个数组
        int[] arr = new int[8];


        //把数据中每一位上的数据获取到后,存储到数组中
        int index = 0;
        while(number > 0){
            arr[index++]= number %10;
            number /= 10;
        }

        //然后将每位数字都加上5,再用和除以10的余数代替该数组
        for (int x = 0;x<arr.length;x++){
            arr[x] += 5;
            arr[x] %= 10;
        }

        //最后将第一位和最后一位交换
        int temp = arr[0];
        arr[0] = arr[index-1];
        arr[index-1] = temp;

        //输出数组中的数据
        printArray(arr,index);
    }
    public static void printArray(int[] arr,int index){
        for (int x=0;x<index;x++){
            System.out.print(arr[x]+"\t");
        }
        System.out.println();
    }
}
代码改进
import java.util.Scanner;

/**
 * 某公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全
 * 在传递过程中需要加密,加密规则如下:
 *  首先将数据倒序,然后将每位数组都加上5,再用和除以10的余数代替该数字,
 *  最后将第一位和最后一位数字交换。
 * 请任意给定一个小于8位的整数,然后,把加密后的结果输出到控制台上
 *
 * 题目要求:
 *  A.数据是小于8位的整数
 *      定义一个int类型的数据
 *      int number = 1232456;
 *  B.加密规则
 *      a.首先将数据倒序
 *        结果 654321
 *      b.然后将每位数字都加上1,再用和除以10的余数代替该数字
 *        结果 109876
 *      c.最后将第一位和最后一位数字交换
 *        结果 609871
 *  C.将加密后的结果输出到控制台
 *
 *  通过简单的分析,我们知道如果我们有办法把这个数据变成数据就好了。
 *
 *  那么,如何把数据转换成一个数组呢?
 *      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;
 *          ...
 *
 */
public class ArgsDemo {
    public static void main(String[] args){
        //创建键盘录入对象
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个小于8位的数字:");
        //定义一个数据
        int number = input.nextInt();

        //调用加密算法
        String result = jiaMi(number);
        System.out.println("加密后的结果是:"+result);
    }
    public static String jiaMi(int number){
        //定义数组
        int[] arr = new int[8];

        //定义索引
        int index = 0;

        //把number中的数据想办法放到数组中
        while(number >0){
            arr[index++] = number %10;
            number /= 10;
        }

        //把每个数据加5,然后对10取余
        for (int x =0;x<arr.length;x++){
            arr[x] += 5;
            arr[x] %= 10;
        }

        //把第一个数据和最后一个数据交换
        int temp = arr[0];
        arr[0] = arr[index-1];
        arr[index-1] = temp;

        //把数组的元素拼接成一个字符串返回
        String str = "";
        for (int x = 0;x<index;x++){
            str += arr[x];
        }
        return str;
    }





}