5.1.6 数组元素间的比较
了解了数组元素的访问后,我们可以利用数组元素的遍历实现很多功能。
1.数组值、最小值和平均值
利用for循环遍历 数组的所有元素可以非常方便的求出数组的值、最小值和平均值。
[例5-5]]求出一个数组的值、最小值、平均值
import java.util.Scanner;
class Array {
//计算数组元素值
public int getMax(int[] a){
int max=a[0];
for(int i=0;i if(max max=a[i];
}
}
return max;
}
//计算数组元素最小值
public int getMin(int[] a){
int min=a[0];
for(int i=0;i if(min>a[i]){
min=a[i];
}
}
return min;
}
//数组元素求和
public int getSum(int[] a){
int sum=0;
for(int i=0;i sum+=a[i];
}
return sum;
}
//计算数组元素平均值,调用getSum方法
public double getAverage(int[] a){
double avg;
//因为getSum(a)和a.length都是int类型,有了(*1.0)后可以使两个int类型的值按double计算
avg=getSum(a)*1.0/a.length;
return avg;
}
}
public class Test5_5{
public static void main(String args[]){
//Sanner类是一个输入类,用于整数、实数、字符串等的输入
Scanner scan = new Scanner(System.in);
int[] a= new int[10];//初始化数组a
System.out.println("请连续输入10个整数");
//利用Scanner的 nextInt方法从键盘输入10个数
//使用a.length的方式,避免数组下标越界异常的发生
for(int i=0;i System.out.print("第"+(i+1)+"个整数:");
a[i]=scan.nextInt();
}
Array myArray = new Array();
System.out.println("数组的值为:"+myArray.getMax(a));
System.out.println("数组的最小值为:"+myArray.getMin(a));
System.out.println("数组的和为:"+myArray.getSum(a));
System.out.println("数组的平均值为:"+myArray.getAverage(a));
}
}
这里我们将对数组元素所做操作集中在一个类Array中实现,在需要使用这些方法的时候只要生成类Array的类对象,通过该类对象就可以调用这些方法了。而不是将这些方法放到主类中实现,直接通过主类的main方法调用。这是一种良好的编程习惯,便于代码复用,应予以提倡。
程序中使用到了Scanner类,下面予以介绍。
Scanner scan = new Scanner(System.in);
定义一个Scanner类的类对象,在定义过程中,Scanner有多个构造方法,这里我们使用的是其中一个,传递的参数System.in是标准输入,即从键盘输入。scan.nextInt()表示从键盘上读入一个整数,除此之外,Scanner还支持doble,float等数据类型数据的读入,分别对应方法nextDouble(),nextFloat()。
表5-1 Scanner类的常用方法
方法 |
说明 |
public int nextInt() |
获取一个int型整数 |
public long nextLong() |
获取一个long型整数 |
public foloat nextFloat() |
获取一个单精度实数 |
public double nextDouble() |
获取一个双精度实数 |
public String next() |
获取一个字符串 |
利用表5-1中的方法可以实现多种数据类型数组的读取,特别注意,方法next的返回值是String类型。
2.数组的排序
数组中集中了多个数据类型相同的元素,为了更好的对数组元素操作,有时候对数组排序是比不可少的,因此,下面我们讨论如何对数组排序。排序算法在数据结构中有多个,这里算法不是我们讲解的重点,我们选择其中一种:冒泡排序(排序后元素值递增)进行讲解。
冒泡排序的关键点是从后向前对相邻的两个数组元素进行比较,若后面元素的值小于前面元素的值,则让两元素交换值;否则,不进行交换。依次遍历所有元素,这样,第一趟排序后数组中的最小值就是下标为0的元素了,依次类推,我们进行第二趟排序(这时候我们无需遍历所有元素,因为数组下标为0的元素,其值已经是最小,我们只需遍历从除下标为0的所有元素),经过第二趟后,下标为1的数组元素存储的是数组中次小的值,这样对于有n个元素的数组,循环执行n-1趟后便可完成排序。当然,也可以从前向后对两个数组元素进行排序,但此时是较大者的值向后移。
[例5-6]
import java.util.Scanner;
class SortClass{
//对数组排序,arr:数组名
public void sort(int[]arr){
int temp;//交换值时作为临时变量
for(int i=0;i for(int k=arr.length-1;k>i;k--){
if(arr[k]>arr[k-1]){//后者小于前者,需要交换两者的值
temp = arr[k];
arr[k]= arr[k-1];
arr[k-1]= temp;
}
}
paint(i+1,arr);//调用数组打印方法
}
}
//打印数组元素,用于排序时检测每趟的排序结果
//time:第几趟,arr:数组名
public void paint(int time,int[] arr){
System.out.print("\n第"+time+"趟排序:");
for(int i=0;i System.out.print(arr[i]+"\t");
}
}
}
public class Test5_6 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=5;//数组元素个数
int[] arr= new int[n];
System.out.println("请从键盘上输入"+n+"个数:");
//利用Scanner的 nextInt方法从键盘输入10个数
for(int i=0;i
arr[i]=scan.nextInt();
}
System.out.println("排序前数组元素值:");
for(int i=0;i System.out.print(arr[i]+"\t");
}
SortClass sc = new SortClass();//生成SortClass的类对象,用以调用sort方法
sc.sort(arr);//调用SortClass的sort方法
System.out.println("\n排序后数组元素值:");//字符串中的"\n"是换行操作
for(int i=0;i System.out.print(arr[i]+"\t");
}
}
}
运行结果如下:
请从键盘上输入5个数:
第1个整数:52
第2个整数:45
第3个整数:68
第4个整数:96
第5个整数:32
排序前数组元素值:
52 45 68 96 32
第1趟排序:96 52 45 68 32
第2趟排序:96 68 52 45 32
第3趟排序:96 68 52 45 32
第4趟排序:96 68 52 45 32
排序后数组元素值:
96 68 52 45 32
从结果中可以看出,经过sort方法处理后,数组元素按升序进行排列了,那么,是否可以让数组元素按从大到小顺序排序的,其实,只要改变判断条件“if(arr[k]>arr[k-1])”中的“>”为“<”即可实现了,读者可自行验证。
3.数组特定数据的查找从数组中查找
从数组中查找特定数据的最简单的办法是遍历数组中的所有元素,这种插好方法也称为线性查找。以下方法indexOf()用于查找arr数组中屈指为value的元素的索引位置,若找不到,返回-1。该方法采用的就是线性查找方式。
public int indexOf(int[] arr,int value){
for(int i=0;i if(arr[i]==value)
return i;//找到,返回对应下标
}//for循环执行完后,表示未找到,则返回-1
return -1;
}
线性查找的时间复杂度为O(n),它适用于小型数组或未排序的数组。对于大型数组,线性查找的效率比较低。如果数组已经排好序,那么我们可以采用高效的二叉查找算法。
二叉查找算法的中心思想史:查找数组中位于中间位置的元素,并将其与查找值进行比较,如果两者相等,就返回该数组元素的下标值;否则,将问题简化为查找已排序数组的一半元素——如果查找值小于数组的中间元素,就查找数组的前半部分,否则就查找数组的后半部分(假设数组按升序排序)。二叉查找的 时间复杂度是 O(log2n)。
例5-7给出了使用二叉查找算法的数组元素查找方法。
[例5-7]
class ArraySearch{
//使用二叉查找算法查找数组arr中值为value的数组元素下标,找不到返回-1
public int indexOf(int[] arr,int value){
int low=0;
int high=arr.length-1;
int middle;
while(low<=high){
middle=(low+high)/2;
if(arr[middle]==value){
return middle;
}
else
if(arr[middle]
}
else{
high=middle-1;
}
}
return -1;
}
}
public class Test5_7 {
public static void main(String[] args) {
int[] arr={1,3,5,7,9,11,13};
ArraySearch as = new ArraySearch();
int index=as.indexOf(arr, 3);
System.out.println("3在数组arr中的下标位置为:"+index);
}
}
运行结果:(分找到、找不到两次实验)
找到:
3在数组arr中的下标位置为:1
找不到:(将查找的值改为:4)
4在数组arr中的下标位置为:-1
2017年计算机二级考试java章节辅导:数组元素间的比较.doc正在阅读:
2017年计算机二级考试java章节辅导:数组元素间的比较11-25
2017年小学教师资格证教育知识与能力简答试题:马斯洛需要层次理论07-22
opporeno7se支持光学防抖吗-有光学变焦吗06-06
2019江西赣州经济技术开发区高中教师招聘公告【30人】10-22
2017大学生村官入党积极分子思想汇报10-06
2019年宁波中考英语试卷及答案,2019年浙江宁波中考英语真题11-21
高一年级英语语法惯用法:blacktea还是redtea12-20
2019年高考保送生等考核增设体育测试10-23
初一入团志愿书格式500字【七篇】04-24