本节介绍数组的应用,用数组实现常用的算法,包括求最大值和最小值、查找、排序等。
示例1:从键盘接收5个数,求出其中的最大值和最小值。
在D盘Java目录下,新建“MaxSample.java”文件。用记事本打开“MaxSample.java”文件,输入以下代码:
import java.util.*;
public class MaxSample
{
public static void main(String args[])
{
//声明长度为5的整型数组,存储用户输入的数值
int num[] = new int[5];
//声明max存储最大值,声明min存储最小值
int max,min,i;
Scanner sc = new Scanner(System.in);
System.out.println("请输入5个数:");
//用for循环输入5个数值并赋值给num数组中元素
for( i = 0; i <5; i++ )
num[i] = sc.nextInt();
//将数组的第一个元素赋值给max和min
max = num[0];
min = num[0];
//遍历数组元素
for( i = 0; i < num.length; i++ )
{
//max小于数组中的元素时,将数组元素赋值给max
if( max < num[i] )
max = num[i];
//min大于数组中的元素时,将数组元素赋值给min
if( min > num[i] )
min = num[i];
}
System.out.printf("\n 最大数为:%d",max);
System.out.printf("\n 最小数为:%d",min);
}
}代码结构分析
程序功能主要是演示在一维数组中如何求最大值和最小值。
求一个数组中的最大值和最小值,可以设置max和min两个变量,max存储最大值,min存储最小值。max和min被初始化为数组元素的第一个值。然后,遍历数组元素,将max和min与数组元素的每一个值进行比较,如果max小于当前遍历的数组元素,将当前数组元素赋值给max,同样,如果min大于当前遍历的数组元素,将当前数组元素赋值给min。
编译“MaxSample.java”文件,在命令行窗口输入“javac MaxSample.java”并执行命令,编译通过后,在命令行窗口输入“java MaxSample”运行Java程序,命令行窗口显示如下信息:
图 9-10 示例1求最大值和最小值输出结果
示例2:建立一个同学通讯录,通过姓名查找电话
在D盘Java目录下,新建“FindSample.java”文件。用记事本打开“FindSample.java”文件,输入以下代码:
import java.util.*;
public class FindSample
{
public static void main(String args[])
{
/**
* 声明5行2列的二维数组
* 行数组长度5表示能够存储5位同学的姓名及电话
* 列数组长度2表示列数组有2个元素,分别是姓名及电话
* 数组类型是String
*/
String phone[][] = new String[5][2];
String name;
int i;
boolean bFind = false;
Scanner sc = new Scanner(System.in);
//phone.lenght为行数组的长度
System.out.printf("请输入 %d 位同学的姓名及电话",phone.length);
// 使用for循环,输入同学的姓名及电话
for( i = 0; i <phone.length; i++ )
{
System.out.printf("\n 请输入第 %d 位同学的姓名:",i+1);
//phone[i][0]为二维数组phone的第i行第0个元素
phone[i][0] = sc.next();
System.out.printf("\n 请输入第 %d 位同学的电话:",i+1);
//phone[i][1]为二维数组phone的第i行第1个元素
phone[i][1] = sc.next();
}
System.out.print("\n ***同学通讯录建立完成***");
/**
* 应用while循环实现通讯录的无限次查找
* while循环的判断条件一直为真,该循环为无限循环
* 用户输入"quit"命令退出循环
*/
while(true)
{
System.out.printf(" \n 请输入同学的姓名,退出请输入quit:");
name = sc.next();
//判断用户是否输入了quit命令
if( name.equals("quit") )
break;
//设置bFind变量为false
bFind = false;
//遍历phone数组元素,查找用户输入的同学姓名是否在数组中
for( i = 0; i < phone.length; i++ )
{
/**
*判断用户输入的姓名是否和当前数组行数第0个元素的内容相等
*如果相等则退出循环
*String的equals方法用于判断与传入字符串是否相等
*/
if( name.equals(phone[i][0]) )
{
//设置bFind变量为true
bFind = true;
break;
}
}
if( bFind )
System.out.printf("\n %s的电话为:%s",name,phone[i][1]);
else
System.out.printf("\n 在通讯录中没有查找到%s",name);
}
}
}代码结构分析
程序功能主要是演示二维数组的赋值及查找使用方法。
程序要求建立一个同学通讯录,可以存储5位同学的姓名及电话,并能实现根据同学姓名查找该同学电话的功能。
根据程序功能描述,可以建立一个5行2列的二维数组,存储5位同学的姓名及电话。通过for循环建立通讯录,通讯录建立完成后,进入查找功能,查找功能通过while循环实现,while的判断条件一直为真,确保程序一直运行在查找状态,直到用户输入quit命令才跳出循环。
编译“FindSample.java”文件,在命令行窗口输入“javac FindSample.java”并执行命令,编译通过后,在命令行窗口输入“java FindSample”运行Java程序,命令行窗口显示如下信息:

图 9-11 示例2同学通讯录输出结果
示例3:冒泡排序算法的实现。
冒泡排序算法的原理是比较两个相邻的元素,将值大的元素和值小的元素进行交换。具体实现思路是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
在D盘Java目录下,新建“SortSample.java”文件。用记事本打开“SortSample.java”文件,输入以下代码:
import java.util.*;
public class SortSample
{
public static void main(String args[])
{
/**
* 声明长度为10的一维数组,存储待排序的数值
* 数组类型是int
*/
int arr[] = new int[10];
int i;
Scanner sc = new Scanner(System.in);
System.out.printf("请输入 %d 个整数",arr.length);
// 使用for循环,接收用户输入的整数
for( i = 0; i <arr.length; i++ )
{
System.out.printf("\n 请输入第 %d 个整数:",i+1);
arr[i] = sc.nextInt();
}
System.out.print("\n ***开始排序***");
/**
* 控制排序趟数
* 有多少个待排序的数值就扫描数组多少趟
* 针对每个待排序数值都要和其它数值进行比较
*/
for( i=0;i<arr.length-1;i++)
{
/**
* 控制每一趟排序多少次
* 每一趟排序都会把较大的数值移动到数组后面
* 第i趟排序循环次数为数组长度减去已经排过序的i个元素
* 如果第j个元素大于第j+1个元素,则交换
*/
for(int j=0;j<arr.length-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
System.out.print("\n ***排序完成***\n");
System.out.println("排序后的数组为:");
for(i = 0; i <arr.length; i++)
{
System.out.print(arr[i]+",");
}
}
}代码结构分析
程序功能主要是演示冒泡排序算法。
程序声明一个整型数组,存储要待排序的数值,然后用for循环语句控制数组的扫描趟数,扫描趟数为待排序数组元素的个数减去1,在每趟扫描中,用for循环遍历待排序数组元素,并进行比较和位置交换,循环范围介于0到排序数组元素的个数减去1再减去外层循环当前执行的扫描趟数,因为i趟排序过程中,已经把i个较大的数交换到数组length-i的数组序号范围,无需再比较和交换。
编译“SortSample.java”文件,在命令行窗口输入“javac SortSample.java”并执行命令,编译通过后,在命令行窗口输入“java SortSample”运行Java程序,命令行窗口显示如下信息:

图 9-12 示例3冒泡排序算法输出结果
■ 知识点拨
数组是基本的数据结构,应用数组结构和算法可以构成诸如堆栈、队列、矩阵等数据结构。数组在应用中,应特别注意数组不能越界,存储的元素数量不能超过数组的容量,建议遍历数组时,遍历条件应采用数组本身提供的length属性获取数组长度。通过数组元素下标存取数组元素时,应预先判断其下标不能超过数组的长度。
■ 思考与练习
编写一个程序,循环接收8个学生的成绩,并计算这8个学生的总分及平均分、最高分和最低分,并将计算得到的总分、平均分、最高分和最低分输出到屏幕上。
提示:声明一个长度为8的浮点型数组,应用for循环接收输入的成绩。然后遍历数组计算数组元素值的和(总分);用和除以数组的长度(平均分);设置max和min两个变量,并赋初值为0,在遍历数组的过程中,与数组的每个元素进行比较。如果max小于当前比较的数组元素,将当前的数组元素赋值给max,如果min大于当前比较的数组元素,将当前的数组元素赋值给min。