2017年计算机二级考试时间,2017年计算机二级考试java章节辅导:数组元素间的比较

副标题:2017年计算机二级考试java章节辅导:数组元素间的比较

时间:2023-11-25 01:49:01 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

  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  System.out.print("第"+(i+1)+"个整数:");

  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]  low=middle+1;

  }

  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

本文来源:https://www.wddqw.com/K6lO.html