java数组-程序员宅基地

技术标签: Java  算法  java  

1:一维数组

1.1 数组概述

那什么是数组呢?为了帮助大家理解,这里我们来看这样的一个场景:

看这里,有一个学员的考试成绩,为了存储这个学员的考试成绩,我们可以采用一个变量进行存储。

但是,假如这里有很多个学员的考试成绩,我们要存储该怎么办呢?

估计有同学就想到了,采用多个变量存储不就行了吗。对,想的没错。

确实可以采用多个变量进行存储,只不过将来要对这多个变量进行操作就比较麻烦了,

比如说:找到成绩最高的学员。按照我们学过的获取两个数的较大值,需要编写大量的判断逻辑才能完成这个操作。

很明显,采用多个变量存储不是好的解决方案。

那怎么办呢?我们再来回顾一下,目前出现的问题是:

1:一次性声明大量的用于存储数据的变量,

2:要存储的数据通常都是同类型数据,例如:考试成绩。

为了解决这种大量的同类型的数据存储,Java就提供了数组供我们使用。

比如说:下面这种格式,就是定义了一个存储多个考试成绩的数组。

  • int[] scores = {100,100,100,100,100,100,100…};

对比一下,比定义多个变量要方便多了,而且操作起来也是很方便的,至于怎么操作,一会我们详细讲解。

好了,知道了数组可以解决这种问题后,我们给数组下一个定义:

  • 数组(array):是一种用于存储多个相同数据类型的存储模型(可以理解为容器)。

1.2 数组定义和静态初始化

数组有两种定义格式:

  • 格式1:数据类型[] 变量名;

  • 范例: int[] arr;

  • 定义了一个int类型的数组,数组名是arr

  • 格式2:数据类型 变量名[];

  • 范例: int arr[];

  • 定义了一个int类型的变量,变量名是arr数组

这两种格式在使用上是没有区别的,但是在阅读的时候是有一个小区别的?

我们先来看格式1:定义了一个int类型的数组,数组名是arr;再来看格式2:定义了一个int类型的变量,变量名是arr数组

很明显,格式1明确的告诉了我们定义的是一个数组,所以,在定义数组的时候,我们推荐使用格式1

现在我们会定义数组了,但是数组中没有数据。而Java中的数组必须先初始化,然后才能使用。

所以,接着,我们来说一下数组的初始化。

  • 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值

  • 注意:数组中的每一个数据,我们称之为数组中的元素

知道了什么是初始化后,我们来说一下数组中的初始化。

数组的初始化分为两种方式:一种是静态初始化,一种是动态初始化。

它们有各自的使用场景,后面我们会讲解到。

这里我们先讲解数组的静态初始化

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

  • 格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3,…};

  • 范例:int[] arr = new int[]{1,2,3};

针对这种格式呢?Java提供了一种简化的格式,让我们使用起来更方便

  • 简化格式:数据类型[] 变量名 = {数据1,数据2,数据3,…};

  • 范例:int[] arr = {1,2,3};

这样呢,我们就能够定义并初始化一个数组了。

好了,关于数组的定义和静态初始化我们就先讲到这里。

1.3 数组元素访问(获取和修改)

而在数组元素访问这一块,我们要学习两个知识:

  1. 一个是数组变量的访问方式

  2. 一个是数组内部保存的数据的访问方式

我们先来说,数组变量访问方式

  • 它的格式是这样的:数组名

我们可以通过输出语句,输出数组名,就能够得到一个数据。那这个数据是什么呢?不着急,一会我们会演示的。

接着,我们来说,数组内部保存的数据的访问方式

  • 它的格式是:数组名[索引]

这个格式没有什么问题,但是这里的索引是什么呢?为了讲解这个索引,我们来看一下这样的一个场景:

在这里有一排人,在这排着队呢,为了知道他们站的位置,给他们进行1,2,3.。。。的编号。

这里的编号是从1开始的。

而计算机中编号习惯从0开始,这个从0开始的编号,我们就称之为索引

接着,我们来说一下:

  • 索引是数组中数据的编号方式

  • 作用:用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊的变量名

  • 它还有这样的几个特征:

    • 特征①:索引从0开始

    • 特征②:索引是连续的

    • 特征③:索引逐一增加,每次加1

知道了如何访问数组变量以及数组中的元素后,下面我们到idea中去演示一下。

/*
    数组变量访问方式
        格式:数组名

    数组内部保存的数据的访问方式
        格式:数组名[索引]
 */
public class ArrayDemo {
    public static void main(String[] args) {
        //定义一个数组,并进行初始化
//        int[] scores = new int[]{93,96,99};
        int[] scores = {93,96,99};

        //输出数组名
        System.out.println(scores); //[I@776ec8df

        //输出数组中的元素
        System.out.println(scores[0]);
        System.out.println(scores[1]);
        System.out.println(scores[2]);
        System.out.println("-----------");

        //修改数组中的元素
        scores[0] = 100;
        scores[1] = 98;
        scores[2] = 95;
        //再次输出数组中的元素
        System.out.println(scores[0]);
        System.out.println(scores[1]);
        System.out.println(scores[2]);
    }
}

1.4 案例1(数组常见操作之遍历)

数组常见操作有很多,这里我们先讲解下面这几个:

  • 遍历

  • 获取最大值

  • 元素打乱

其他的操作,后续我们会进行讲解。

首先,我们来讲解数组遍历,那什么是数组遍历?我们一起来说一下:

  • 数组遍历指的是:获取数组中的每一个元素,我们可以把获取到的元素输出在控制台

知道了什么是数组遍历后,我们到IDEA中去实现一下,然后再回来总结。

/*
    遍历
 */
public class ArrayTest01 {
    public static void main(String[] args) {
        //定义数组并初始化
        int[] arr = {77, 88, 99, 66, 55, 44};

        //获取数组中的元素
//        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]);

        //用循环改进
//        for (int i=0; i<5; i++) {
//            System.out.println(arr[i]);
//        }

        //格式:数组名.length
//        System.out.println(arr.length);

        for (int i=0; i<arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

什么是数组遍历:

  • 获取数组中的每一个元素,我们可以把获取到的元素输出在控制台

获取数组长度(元素个数):

  • 格式:数组名.length

  • 范例:arr.length

数组遍历通用格式

注意:数组遍历指的是把数组中的元素取出来,取出来之后可以(打印,求和,判断…)

数组遍历通用格式: for (int i = 0; i < scores.length; i++) { scores[i] } 注意:数组遍历指的是把数组中的元素取出来,取出来之后可以(打印,求和,判断…)。 选择哪种操作,得根据我们的实际需求来看。

1.5 案例2(数组常见操作之获取最大值)

看这里,这是一组家庭成员:

给出一组数据,这些数据表示的是他们的年龄。68是最大年龄,4是最小年龄,所以,68和4就可以被称之为最值。

再给出一组数据,这些数据表示的是他们的身高,171是最高身高,81是最低身高,所以,171和81就可以被称之为最值。

那这里的171为什么就是最高身高呢?

很明显,要想说171是最高身高,我们就要把这些数据从头到尾比较了一遍,最终找到了最高身高171。

而要进行比较,我们的先把这些数据保存起来。这里我们就采用数组把这些数据给保存起来。

知道了大量同类型数据用数组保存和最值的知识后,我们来看一下我们的需求:

  • 我这里有一个数组,我现在要获取数组中的最大值

如何实现呢?接下来,我们说一下思路:

1:因为我们最终,要得到最大值,所以,这里我们定义一个变量,用于保存最大值。

但是,它没有初始值,给多少比较合适呢?我总不能拿数组以外的数据进来吧,因为我们最终获取的是数组中的最大值。所以,我们就要从数组中找一个值作为初始值。

一般来说,我们取数组中第一个元素作为参照值。

2:这样我们的最大值变量就有初始值了,接下来,我们与数组中剩余的数据逐个比较,比完之后,max中最终保存的是最大值。

这个动作怎么实现呢?我们来说一下:获取索引1-4,为什么不从0开始呢?因为0索引位置的值已经作为初始值了。

3:我们每次比较,需要把最大值保存到max变量中,这个动作,我们可以通过if语句实现。

4:当循环结束后,打印max变量就可以了,这个max里面保存的就是最大值。

说完了数组获取最大值的思路后,我们到idea中去实现一下:

/*
    获取最大值
 */
public class ArrayTest02 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {12, 45, 98, 73, 60};

        //定义变量max存储最大值,取第一个数据为变量的初始值
        int max = arr[0];

        //与数组中剩余数据逐个比对,每次比对将最大值保存到变量max中
        for (int i=1; i<arr.length; i++) {
            if(arr[i] > max) {
                max = arr[i];
            }
        }

        //循环结束后输出变量max的值
        System.out.println("max:" + max);
    }
}

1.6 案例3(数组常见操作之元素打乱)

那什么是元素打乱呢?

  • 元素打乱就是把数组中的元素随机交换位置,每次运行都可能产生不一样的结果

比如:arr = {12, 45, 98, 73, 60};

遍历:

  • 正常情况下:12,45,98,73,60

  • 元素打乱后:45,73,12,60,98

涉及到的操作:

  • 获取数组中元素的随机索引

    • Random r = new Random();

    • int index = r.nextInt(arr.length);

  • 数组中元素交换

获取随机索引比较好实现,但是元素交换该如何实现呢?

这里为了帮助大家更好的理解,我们给出这样的一个场景来理解数据交换:

把啤酒杯和红酒杯里面的酒进行交换

如何实现呢?

第一步:找来一个同类型的空酒杯

第二步:把红酒倒入到空酒杯中

第三步:把啤酒倒入到曾经装红酒的杯子中

第四步:把红酒从临时找来的杯子中倒入到曾经装啤酒的杯子中

这样我们就实现了啤酒杯和红酒杯里面的酒进行交换。这种思想同样也适合我们程序中的数据交换。

下面我们到IDEA中去演示一下数据的交换:

/*
    数据交换
 */
public class DataSwap {
    public static void main(String[] args) {
//        int a = 10;
//        int b = 20;
//        System.out.println("交换前:a=" + a + ",b=" + b);
//        int temp = a;
//        a = b;
//        b = temp;
//        System.out.println("交换后:a=" + a + ",b=" + b);

        int[] arr = {11, 22, 33, 44, 55};
        System.out.println("交换前:arr[0]=" + arr[0] + ",arr[4]=" + arr[4]);
        int temp = arr[0];
        arr[0] = arr[4];
        arr[4] = temp;
        System.out.println("交换后:arr[0]=" + arr[0] + ",arr[4]=" + arr[4]);
    }
}

数据的交换演示完毕后,下面我们就可以来实现把数组中的元素打乱了:

import java.util.Random;

/*
    元素打乱
 */
public class ArrayTest03 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {12, 45, 98, 73, 60};

//        Random r = new Random();
//        int index = r.nextInt(arr.length);
//
//        //第一次交换
//        int temp = arr[0];
//        arr[0] = arr[index];
//        arr[index] = temp;
//
//        //第二次交换
//        index = r.nextInt(arr.length);
//        temp = arr[1];
//        arr[1] = arr[index];
//        arr[index] = temp;

        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            int index = r.nextInt(arr.length);

            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }

        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

1.7 数组动态初始化

前面呢,我们已经学习过了静态初始化,也就是初始化时指定每个数组元素的初始值。

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

这里我们来看一下动态初始化的格式:

  • 格式:数据类型[] 变量名 = new 数据类型[数组长度];

  • 范例:int[] arr = new int[3];

表示我们定义了一个int类型的数组,初始化为3个元素。

知道了如何对数组进行动态初始化之后,下面我们到IDEA中去使用一下:

/*
    动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
    格式:数据类型[] 变量名 = new 数据类型[数组长度];
    范例:int[] arr = new int[3];
 */
public class ArrayDemo {
    public static void main(String[] args) {
        //格式:数据类型[] 变量名 = new 数据类型[数组长度];
        int[] arr = new int[3];

        //输出数组名
        System.out.println(arr); //[I@776ec8df

        //输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println("------------");

        //修改数组中的元素
        arr[0] = 10;
        arr[1] = 20;
        arr[2] = 30;

        //再次输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

演示完毕之后,回到资料我们总结一下数组初始化的两种方式的各自使用场景:

  • 静态初始化:开始就存入元素值,适合一开始就能确定元素值的业务场景

  • 动态初始化:指定数组长度,后期赋值,适合开始知道数据的数量,但是不确定具体元素值的业务场景

  • 注意:两种初始化的方式是独立的,不可以混用

1.8 案例4(数组元来自键盘录入)

首先呢,我们来看一下具体的需求:

  • 需求:定义一个可以存储5个元素的int数组,数据来自于键盘录入,最后遍历数组,把元素输出在控制台

首先,我们来简单的分析一下:

这个数组可以存储5个int类型的元素,但是数据来自于键盘录入,也就是先指定数组长度,后期赋值。

这很明显适合使用数组的动态初始化,所以,这里我们将采用动态初始化对数组进行初始化。

接着,数据来自于键盘录入,我们得知道这里要使用Scanner来实现。

明确了这两个内容后,下面我们到IDEA中一起去实现一下:

import java.util.Scanner;

/*
    需求:定义一个可以存储5个元素的int数组,数据来自于键盘录入,最后遍历数组,把元素输出在控制台
 */
public class ArrayTest {
    public static void main(String[] args) {
        //定义一个数组,并进行动态初始化
        int[] arr = new int[5];

        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);

//        //录入第1个数据
//        System.out.println("请输入第1个数据:");
        int i = sc.nextInt();
        arr[0] = i;
//        arr[0] = sc.nextInt();
//
//        //录入第2个数据
//        System.out.println("请输入第2个数据:");
//        arr[1] = sc.nextInt();

        for (int i = 0; i < arr.length; i++) {
            System.out.println("请输入第" + (i + 1) + "个元素:");
            arr[i] = sc.nextInt();
        }

        printArray(arr);

            //输出内容并换行
//        System.out.println("hello");
//        System.out.println("world");
            //输出内容不换行
//        System.out.print("hello");
//        System.out.print("world");
    }

    public static void printArray(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1) {
                System.out.print(arr[i]);
            }else {
                System.out.print(arr[i] + ", ");
            }
        }
        System.out.println("]");
    }

    /*
        参数:int[] arr
        返回值:void
     */
//    public static void printArray(int[] arr) {
//        for (int i = 0; i < arr.length; i++) {
//            System.out.println(arr[i]);
//        }
//    }
}

1.9 数组内存图

这里呢,我们通过单个数组的内存图让大家了解一下数组在内存中的存储和使用就可以了。

整个过程讲解的是下图代码的执行流程,大家能够听懂即可。

最后,我们自己编写代码验证一下:

/*
    数组内存图代码
 */
public class ArrayTest01 {
    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]);

        //给数组中的元素赋值
        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]);
    }
}

1.10 数组使用中的两个小问题

先来看第一个问题:请问下列代码有问题吗?如果有,是什么问题?如何解决?

通过内存图进行讲解:

最终结论是:

  • 有问题

  • 访问了不存在的索引位置元素

  • 修改不存在的索引为正确的索引。范围(0~数组长度-1)

再来看第二个问题:请问下列代码有问题吗?如果有,是什么问题?如何解决?

通过内存图进行讲解:

最终结论是:

  • 有问题

  • 对象设置为null,不在指向堆内存数据了,还想继续访问堆内存数据

  • 对象在使用前,进行不为null的判断

讲解完毕后,到IDEA中再去通过代码验证一下:

/*
    数组使用中的两个小问题
        1:索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
            ArrayIndexOutOfBoundsException

        2:空指针异常:对象不再指向堆内存,还想继续访问数据,访问失败
            NullPointerException

        null:空值,引用数据类型的默认值,表示不指向任何有效对象
 */
public class ArrayTest02 {
    public static void main(String[] args) {
        int[] arr = new int[3];
        //输出元素
        //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
//        System.out.println(arr[3]);
        System.out.println(arr[2]);

        //把null赋值给arr
        arr = null;
        //输出元素
        //Exception in thread "main" java.lang.NullPointerException: Cannot load from int array because "arr" is null
        if(arr != null) {
            System.out.println(arr[0]);
        }
    }
}

2:二维数组

2.1 二维数组概述

这里我们来看这样的一个场景:

需求:我们要存储多个班级的学生的考试成绩,该怎么办呢?

如果要存储一个班级中多个学生的考试成绩,我们就可以采用数组来存储。

现在的问题是?多个班级的考试成绩,我们针对每个班级都采用数组存储。

第一个班级:数组1

第二个班级:数组2

第三个班级:数组3 …

但是多个班级,也可以采用数组存储啊。所以,Java就提供了二维数组供我们使用。

这里我们给二维数组一个简单的定义:

  • 二维数组:元素为一维数组的数组

知道了什么是二维数组后,我们再说一下二维数组的定义格式:

它有这样的三个格式,用表示二维数组:

  1. 数据类型 变量名; int arr; 推荐

  2. 数据类型 变量名; int arr;

  3. 数据类型[] 变量名[]; int[] arr[];

2.2 二维数组初始化

二维数组初始化,和一维数组一样,二维数组初始化也有两种格式:

  1. 静态初始化

  2. 动态初始化

首先来看静态初始化:

  • 格式:数据类型 变量名 = new 数据类型{ {元素…},{元素…},{元素…},…};

  • 范例:int arr = new int{ {1,2,3},{4,5,6},{7,8,9}};

解读:

  • 定义了一个二维数组

  • 二维数组中有三个元素(一维数组)

  • 每一个一维数组有三个元素(int类型数据)

  • 注意:一维数组中元素的个位可以是不同的

  • 比如: int arr = new int{ {1,2,3},{4,5},{6,7,8,9}};

同样,针对静态初始化,二维数组也给出了简化格式:

  • 简化格式:数据类型 变量名 = { {元素…},{元素…},{元素…},…};

  • 范例:int arr = { {1,2,3},{4,5,6},{7,8,9}};

再来看动态初始化:

  • 格式:数据类型 变量名 = new 数据类型m;

  • 范例:int arr = new int2;

解读:

  • 定义了一个二维数组

  • 二维数组中有2个元素(一维数组)

  • 每一个一维数组有3个元素(int类型数据)

他们的各自使用场景和一维数组中讲解的是一样的:

静态初始化:适合一开始就能确定元素值的业务场景

动态初始化:适合开始知道数据的数量,但是不确定具体元素值的业务场景

2.3 二维数组元素访问

来,继续啊,下面我们来学习二维数组元素访问。

关于二维数组的元素访问,我们先到idea中去讲解,然后再回来总结:

/*
    静态初始化简化格式:数据类型[][] 数组名 = {
   {元素...},{元素...},{元素...},...};
 */
public class ArrayDemo {
    public static void main(String[] args) {
        //静态初始化简化格式:数据类型[][] 数组名 = {
   {元素...},{元素...},{元素...},...};
        int[][] arr = {
   {1, 2, 3}, {4, 5, 6}};

        //输出数组名
        System.out.println(arr); //[[I@776ec8df

        System.out.println(arr[0]); //[I@4eec7777
        System.out.println(arr[1]); //[I@3b07d329

        //如何获取到数据1,2,3呢?
        System.out.println(arr[0][0]);
        System.out.println(arr[0][1]);
        System.out.println(arr[0][2]);
    }
}

总结:

  • 获取二维数组:数组名

  • 获取每一个一维数组:数组名[索引]

  • 获取每一个二维数组元素:数组名索引

2.4 二维数组内存图

这里呢,我们通过内存图的方式让大家了解一下二维数组在内存中的存储和使用就可以了。

整个过程讲解的是下图代码的执行流程

最后,我们自己编写代码验证一下:

/*
    二维数组内存图代码
 */
public class ArrayTest {
    public static void main(String[] args) {
        //定义二维数组
        int[][] arr = {
   {1, 2, 3}, {4, 5, 6}};

        //输出数组中的元素
        System.out.println(arr[0][1]);
        System.out.println(arr[1][1]);

        //修改数组中的元素
        arr[0][1] = 10;
        arr[1][1] = 20;

        //再次输出数组中的元素
        System.out.println(arr[0][1]);
        System.out.println(arr[1][1]);
    }
}

2.5 案例5(二维数组常见操作之遍历)

这里我们讲解两个操作:

  • 遍历

  • 元素打乱

首先,我们来看二维数组遍历。

这里有一个需求:已知一个二维数组 arr = { {1,2,3},{4,5,6},{7,8,9}}; 请把元素在控制台输出。

看完需求之后,我们到IDEA中一起去实现一下,然后再回来总结:

/*
    需求:已知一个二维数组 arr = {
   {1,2,3},{4,5,6},{7,8,9}}; 请把元素在控制台输出
 */
public class ArrayTest01 {
    public static void main(String[] args) {
        //定义二维数组,并进行静态初始化
        int[][] arr = {
   {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

        //获取数据1,2,3
//        System.out.println(arr[0][0]);
//        System.out.println(arr[0][1]);
//        System.out.println(arr[0][2]);
//        for (int i = 0; i < arr[0].length; i++) {
//            System.out.println(arr[0][i]);
//        }
//
//        //获取数据4,5,6
        System.out.println(arr[1][0]);
        System.out.println(arr[1][1]);
        System.out.println(arr[1][2]);
//        for (int i = 0; i < arr[1].length; i++) {
//            System.out.println(arr[1][i]);
//        }
//
//        //获取数据7,8,9
        System.out.println(arr[2][0]);
        System.out.println(arr[2][1]);
        System.out.println(arr[2][2]);
//        for (int i = 0; i < arr[2].length; i++) {
//            System.out.println(arr[2][i]);
//        }

        for (int i = 0; i < arr.length; i++) {
            //arr[i]
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }
}

在实现的过程中,我们在二维数组中使用了循环嵌套:

① 循环嵌套:循环语句中嵌套循环语句

② 通过外层循环可以得到一维数组

③ 在通过内存循环可以得到每一个二维数组元素

2.6 案例6(二维数组常见操作之元素打乱)

在前面呢,我们讲解过一维数组中的元素打乱,这里的思路和前面是一样的,也是要随机产生二维数组中元素的索引,并进行元素交换。

只不过呢,二维数组元素的索引是两个值,所以,这里要产生两个随机数。

知道了二维数组元素打乱的基本思路后,下面我们到IDEA中去实现一下:

import java.util.Random;

/*
    需求:已知二维数组 arr = {
   {1,2,3},{4,5,6},{7,8,9}};用程序实现把数组中的元素打乱,并在控制台输出打乱后的数组元素
 */
public class ArrayTest02 {
    public static void main(String[] args) {
        //定义二维数组,并进行静态初始化
        int[][] arr = {
   {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

        //创建随机数对象
        Random r = new Random();

        //遍历二维数组,进行元素打乱
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                //arr[i][j]
                int x = r.nextInt(arr.length);
                int y = r.nextInt(arr[x].length);

                //元素交换
                int temp = arr[i][j];
                arr[i][j] = arr[x][y];
                arr[x][y] = temp;
            }
        }

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}

2.7 案例7(图片展示)

关于图片展示呢?前面我们是学习过的,通过JLable组件就可以实现图片展示了。

看一下,我们这里的需求,我有很多小的图片,它们拼在一起就成了这样的一张美女美图。

下面我们要做的事情就是把这些图片一张张的给展示出来。

这里的窗体我们已经准备好了,我们要做的事情就是在窗体上显示这些图片。

下面我们到IDEA中去实现一下:

import javax.swing.*;

/*
    图片展示
 */
public class ArrayTest03 {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("图片展示");
        jf.setSize(380, 400);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

//        JLabel jLabel1 = new JLabel(new ImageIcon("itheima-array2\\images\\1.png"));
//        jLabel1.setBounds(0, 0, 90, 90);
//        jf.add(jLabel1);
//
//        JLabel jLabel2 = new JLabel(new ImageIcon("itheima-array2\\images\\2.png"));
//        jLabel2.setBounds(90, 0, 90, 90);
//        jf.add(jLabel2);
//
//        JLabel jLabel3 = new JLabel(new ImageIcon("itheima-array2\\images\\3.png"));
//        jLabel3.setBounds(180, 0, 90, 90);
//        jf.add(jLabel3);
//
//        JLabel jLabel4 = new JLabel(new ImageIcon("itheima-array2\\images\\4.png"));
//        jLabel4.setBounds(270, 0, 90, 90);
//        jf.add(jLabel4);

//        for (int i=0; i<4; i++) {
//            JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+(i+1)+".png"));
//            jLabel.setBounds(i*90,0,90,90);
//            jf.add(jLabel);
//        }
//
        JLabel jLabel5 = new JLabel(new ImageIcon("itheima-array2\\images\\5.png"));
        jLabel5.setBounds(0, 90, 90, 90);
        jf.add(jLabel5);

        JLabel jLabel6 = new JLabel(new ImageIcon("itheima-array2\\images\\6.png"));
        jLabel6.setBounds(90, 90, 90, 90);
        jf.add(jLabel6);

        JLabel jLabel7 = new JLabel(new ImageIcon("itheima-array2\\images\\7.png"));
        jLabel7.setBounds(180, 90, 90, 90);
        jf.add(jLabel7);

        JLabel jLabel8 = new JLabel(new ImageIcon("itheima-array2\\images\\8.png"));
        jLabel8.setBounds(270, 90, 90, 90);
        jf.add(jLabel8);
//        for (int i=0; i<4; i++) {
//            JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+(i+5)+".png"));
//            jLabel.setBounds(i*90,90,90,90);
//            jf.add(jLabel);
//        }
//
        JLabel jLabel9 = new JLabel(new ImageIcon("itheima-array2\\images\\9.png"));
        jLabel9.setBounds(0, 180, 90, 90);
        jf.add(jLabel9);

        JLabel jLabel10 = new JLabel(new ImageIcon("itheima-array2\\images\\10.png"));
        jLabel10.setBounds(90, 180, 90, 90);
        jf.add(jLabel10);

        JLabel jLabel11 = new JLabel(new ImageIcon("itheima-array2\\images\\11.png"));
        jLabel11.setBounds(180, 180, 90, 90);
        jf.add(jLabel11);

        JLabel jLabel12 = new JLabel(new ImageIcon("itheima-array2\\images\\12.png"));
        jLabel12.setBounds(270, 180, 90, 90);
        jf.add(jLabel12);
//        for (int i=0; i<4; i++) {
//            JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+(i+9)+".png"));
//            jLabel.setBounds(i*90,180,90,90);
//            jf.add(jLabel);
//        }
//
        JLabel jLabel13 = new JLabel(new ImageIcon("itheima-array2\\images\\13.png"));
        jLabel13.setBounds(0, 270, 90, 90);
        jf.add(jLabel13);

        JLabel jLabel14 = new JLabel(new ImageIcon("itheima-array2\\images\\14.png"));
        jLabel14.setBounds(90, 270, 90, 90);
        jf.add(jLabel14);

        JLabel jLabel15 = new JLabel(new ImageIcon("itheima-array2\\images\\15.png"));
        jLabel15.setBounds(180, 270, 90, 90);
        jf.add(jLabel15);

        JLabel jLabel16 = new JLabel(new ImageIcon("itheima-array2\\images\\16.png"));
        jLabel16.setBounds(270, 270, 90, 90);
        jf.add(jLabel16);
//        for (int i=0; i<4; i++) {
//            JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+(i+13)+".png"));
//            jLabel.setBounds(i*90,270,90,90);
//            jf.add(jLabel);
//        }

        //定义图片编号的数组
        int[][] datas = {
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16}
        };

        for (int i = 0; i < datas.length; i++) {
            for (int j = 0; j < datas[i].length; j++) {
                //datas[i][j]
                JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+datas[i][j]+".png"));
                jLabel.setBounds(j*90,i*90,90,90);
                jf.add(jLabel);
            }
        }

        jf.setVisible(true);
    }
}

2.8 案例8(图片打乱)

刚才我们讲解了图片展示的案例,现在呢,要在图片展示的基础上,把图片打乱,我们可以看一下打乱后的效果,其实就是对二维数组中的图片的编号打乱,然后再显示出来就可以了。

下面呢,我们到IDEA中一起去实现一下:

import javax.swing.*;
import java.util.Random;

/*
    图片打乱
 */
public class ArrayTest04 {
    public static void main(String[] args) {
        //创建窗体对象
        JFrame jf = new JFrame();

        jf.setTitle("图片打乱");
        jf.setSize(380, 400);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        jf.setAlwaysOnTop(true);
        jf.setLayout(null);

        //图片打乱
        int[][] datas = {
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16}
        };

        Random r = new Random();
        for (int i = 0; i < datas.length; i++) {
            for (int j = 0; j < datas[i].length; j++) {
                int x = r.nextInt(datas.length);
                int y = r.nextInt(datas[x].length);

                int temp = datas[i][j];
                datas[i][j] = datas[x][y];
                datas[x][y] = temp;
            }
        }

        for (int i = 0; i < datas.length; i++) {
            for (int j = 0; j < datas[i].length; j++) {
                JLabel jLabel = new JLabel(new ImageIcon("itheima-array2\\images\\"+datas[i][j]+".png"));
                jLabel.setBounds(j*90,i*90,90,90);
                jf.add(jLabel);
            }
        }

        jf.setVisible(true);
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_68522070/article/details/135569878

智能推荐

Python 入门的60个基础练习_练习python基础语法-程序员宅基地

文章浏览阅读4.2w次,点赞329次,收藏2.7k次。Python 入门的60个基础练习_练习python基础语法

iOS6和iOS7代码的适配(2)——status bar_ios7 statusbar-程序员宅基地

文章浏览阅读1w次。用Xcode5运行一下应用,第一个看到的就是status bar的变化。在iOS6中,status bar是系统在处理,应用_ios7 statusbar

gdb调试时No symbol "var" defined in current context && No Register_no registers调试显示-程序员宅基地

文章浏览阅读2.1k次。问题描述:,在gdb调试程序输出变量:p var,会提示No symbol "var" in current context.原因:程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很正常的,因为优化程序会删改程序,整理程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指_no registers调试显示

IDGeneratorUtil 主键id生成工具类_idgeneratorutils.generateid()-程序员宅基地

文章浏览阅读3.4k次。import java.util.Random;import org.drools.util.UUIDGenerator;/** * * * 类名称:GenerateIdUtil * 类描述: 主键生成工具类 * @author chenly * 创建时间:Jul 10, 2012 8:10:43 AM * 修改人: * 修改时间:Jul 10, 2012 8..._idgeneratorutils.generateid()

关于汇编 BX 和 BLX 跳转指令_汇编blx-程序员宅基地

文章浏览阅读5k次。BX:跳转到寄存器reg给出的目的地址处,如:BX R2BLX:跳转到寄存区reg给出的目的地址处并将返回地址存储到LR(R14)使用这两个指令时有一点特别需要注意:跳转的目的地址必须是奇数,若不是奇数则在后面加1,如某函数的起始地址是0x80000f00,则要跳转到此函数则应该跳转到0x80000f01处!否则会进入硬件错误中断!..._汇编blx

前端vue,打包整合进后端springboot的resources里面后,运行只要刷新就报404_前端项目放入resource-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏4次。vue打包后,其实就剩index.html和一堆静态资源,页面的加载和替换都是通过刷新index.html种的dom来实现的(应该是这样,可能表述不是很好),所以做个重定向就可以了。(博主是这么解决的,网上还有很多人是各种路径错误,大家可以尝试下自己是哪个原因)import org.springframework.boot.web.server.ConfigurableWebServerFa..._前端项目放入resource

随便推点

添加远程github仓库时报错 Warning: Permanently added the RSA host key for IP address 52.74.223.119_cmd warning: permanently added-程序员宅基地

文章浏览阅读9.7k次。1.问题展示2.解决方案1.任意窗口, 打开git bash2.命令行界面, 输入cd C:3.cat ~/.ssh/id_rsa.pub正常下面应该显示一大串公钥如果没有,显示如下图, 则进行下一步, 创建公钥4.创建公钥, 输入 ssh-keygen5.然后一直下一步, 直到出现6.再次输入cat ~/.ssh/id_rsa.pub下面一大串数字便是公钥,复制这些字符串, 打开github, 点击头像, 打开settings, 打开SSH and GPG Keys_cmd warning: permanently added

SQL*Plus 使用技巧1-程序员宅基地

文章浏览阅读154次。[code="java"]1. SQL/Plus 常用命令 a. help [topic] 查看命令的使用方法,topic表示需要查看的命令名称。 如: help desc; b. host 该命令可以从SQL*Plus环境切换到操作系统环境,以便执行操作系统命名。 c. host [command] 在sql*plus环境中执行操作系统命令,如:host notepad.exe..._sql+plus的使用方法

域控服务器搭建与管理论文,校园网络服务器的配置与管理 毕业论文.doc-程序员宅基地

文章浏览阅读441次。该文档均来自互联网,如果侵犯了您的个人权益,请联系我们将立即删除!**学校毕 业 论 文**学校园网络服务器的配置与管理姓 名: **学 号: **指导老师:系 名:专 业: 计算机网络技术班 级:二0一一年十二月十五日摘 要随着网络技术的不断发展和Internet的日益普及,许多学校都建立了校园网络并投入使用,这无疑对加快信息处理,提高工作效..._服务器配置与应用论文

mysql单实例多库与多实例单库_数据库单实例和多实例-程序员宅基地

文章浏览阅读1k次。一、单实例多库:一个mysql实例,创建多个数据目录。规划:实例路径:/usr/local/mysql数据目录路径:(1)/usr/local/mysql/data(2)/usr/local/mysql/data2步骤:安装mysql。配置my.cnf文件。初始化各个数据库。用mysqld_multi启动。1、安装mysql。平常安装。2、m..._数据库单实例和多实例

MFC解决找不到MFC90.DLL的问题_microsoft v90.debugmfc-程序员宅基地

文章浏览阅读6.3k次。今天装了第三方的MFC软件库Xtreme ToolkitPro v15.0.1,听说搞MFC的人都知道它的强大,我刚学习,所以装了一个,然后想运行一下它自带的例子看看。出现一个“找不到mfc90.dll“的问题,百度一下,记录如下:vs2008已经打过sp1补丁,编译C++程序会提示找不到mfc90.dll文件的错误,但是如果是release版的话就能正常运行csdn看到解决方案,粘贴_microsoft v90.debugmfc

XeLaTeX-中文排版解决方案_latex 中文排版 texlive-程序员宅基地

文章浏览阅读2.1k次。以前使用CJK进行中文的排版,需要自己生成字体库,近日,出现了XeTeX,可以比较好的解决中文字体问题,不需要额外生成LaTeX字体库,直接使用计算机系统里的字体,本文以在Linux下为例说明XeTeX的使用。操作系统: UbuntuTeX:除了texlive包外,还需要安装的包是texlive-xetex。字体:可以使用fc-list查看你自己的字体库,注意字体的完整名称,在XeTe..._latex 中文排版 texlive