数组的常见操作
在程序开发中,数组的应用非常广泛,灵活地使用数组对实际开发很重要。接下来,本节将针对数组的常见操作,如数组的遍历、最值的获取、数组的排序等,进行详细地讲解。
1.数组遍历
在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。接下来通过一个案例来学习一下如何使用for循环来遍历数组,如文件1所示。
文件1 Example22.java
1 public class Example22 {
2 public static void main(String[] args) {
3 int[] arr = { 1, 2, 3, 4, 5 }; // 定义数组
4 // 使用for循环遍历数组的元素
5 for (int i = 0; i < arr.length; i++) {
6 System.out.println(arr[i]); // 通过索引访问元素
7 }
8 }
9 }
运行结果如图1所示。
图1 运行结果
文件1中,定义了一个长度为5的数组arr,数组角标的取值范围为0~4。由于for循环中定义的变量i的值在循环过程中为0~4,因此可以作为索引,依次去访问数组中的元素,并将元素的值打印出来。
2.数组最值
在操作数组时,经常需要获取数组中元素的最值。接下来通过一个示例来演示如何获取数组中元素的最大值,如文件2所示。
文件2 Example23.java
1 public class Example23 {
2 public static void main(String[] args) {
3 // 1、定义一个int[]数组
4 int[] arr = { 4, 1, 6, 3, 9, 8 };
5 // 2、定义变量max用于记住最大数,首先假设第一个元素为最大值
6 int max = arr[0];
7 // 3、遍历数组,查找最大值
8 for (int i = 1; i < arr.length; i++) {
9 // 比较 arr[i]的值是否大于max
10 if (arr[i] > max) {
11 // 条件成立,将arr[i]的值赋给max
12 max = arr[i];
13 }
14 }
15 System.out.println("数组arr中的最大值为:" + max); // 打印最大值
16 }
17 }
运行结果如图2所示。
图2 运行结果
文件2中,定义了一个临时变量max,用于记住数组的最大值。首先假设数组中第一个元素arr[0]为最大值,然后使用for循环对数组进行遍历,在遍历的过程中只要遇到比max值还大的元素,就将该元素赋值给max,这样一来,变量max就能够在循环结束时记住数组中的最大值。
3.数组排序
在操作数组时,经常需要对数组中元素进行排序。接下来讲解一种比较常见的数组排序算法——冒泡排序。所谓冒泡排序,就是不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程和水中气泡上升的原理相似。
接下来通过几个步骤来具体分析一下冒泡排序的整个过程,具体如下:
第1步,从第一个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前一个元素比后一个元素大,则交换它们的位置。整个过程完成后,数组中最后一个元素自然就是最大值,这样也就完成了第一轮比较。
第2步,除了最后一个元素,将剩余的元素继续进行两两比较,过程与第一步相似,这样就可以将数组中第二大的数放在了倒数第二个位置。
第3步,以此类推,持续对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较为止。
了解了冒泡排序的原理之后,接下来通过一个案例来实现冒泡排序,如文件3所示。
文件3 Example24.java
1 public class Example24 {
2 public static void main(String[] args) {
3 int[] arr = { 9, 8, 3, 5, 2 };
4 // 1、冒泡排序前,先循环打印数组元素
5 for (int i = 0; i < arr.length; i++) {
6 System.out.print(arr[i] + " ");
7 }
8 System.out.println(); // 用于换行
9 // 2、进行冒泡排序
10 // 2.1、外层循环定义需要比较的轮数(两数对比,要比较n-1轮)
11 for (int i= 1; i < arr.length; i++) {
12 // 2.2、内层循环定义第i轮需要比较的两个数
13 for (int j = 0; j < arr.length -i; j++) {
14 if (arr[j] > arr[j + 1]) { // 比较相邻元素
15 // 下面的三行代码用于相邻两个元素交换
16 int temp = arr[j];
17 arr[j] = arr[j + 1];
18 arr[j + 1] = temp;
19 }
20 }
21 }
22 // 3、完成冒泡排序后,再次循环打印数组元素
23 for (int i = 0; i < arr.length; i++) {
24 System.out.print(arr[i] + " ");
25 }
26 }
27 }
运行结果如图3所示。
图3 运行结果
文件3中,第2步通过一个嵌套for循环实现了冒泡排序。其中,外层循环用来控制进行多少轮比较,每一轮比较都可以确定一个元素的位置,由于最后一个元素不需要进行比较,因此外层循环的次数为arr.length-1;内层循环的循环变量用于控制每轮进行比较的相邻的两个数,它被作为角标去比较数组的元素,由于变量在循环过程中是自增的,这样就可以实现相邻元素依次进行比较,在每次比较时,如果前者小于后者,就交换两个元素的位置,具体执行过程如图4所示。
图4 冒泡排序
从图4可以看出,在第一轮比较中,第一个元素“9”为最大值,因此它在每次比较时都就会发生位置的交换,最终被放到最后一个位置;第二轮比较与第一轮过程类似,元素“8”被放到倒数第二个位置;第三轮比较中,第一次比较没有发生位置的交换,在第二次比较时才发生位置交换,元素“5”被放到倒数第三个位置;第四轮比较只针对最后两个元素,它们比较后发生了位置的交换,元素“3”被放到第二个位置。通过四轮比较,很明显,数组中的元素已经完成了排序。
值得一提的是,文件3中第16~18行代码实现数组中两个元素交换的过程。首先定义了一个临时变量temp用于记住数组元素arr[j]的值,然后将arr[j+1]的值赋给arr[j],最后再将temp的值赋给arr[j+1],这样便完成了两个元素的交换。整个交换过程如图5所示。
图5 交换步骤