8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Java编程那些事儿45—数组使用示例

IT171中文网 游客组 2013-11-26 773

6.3 数组使用示例
本部分通过一系列的示例,熟悉数组的基本语法,并演示一些使用数组可以解决的基本问题。在实际使用数组时,数组的长度以及数组中每个元素存储的数据,都根据逻辑需要进行设计。
6.3.1 循环初始化数组元素
要求:初始化一个长度为100的int数组,数组中的元素依次为1-100。
这是一个基本的使用,主要是熟悉数组的语法,在实际编写时,需要发现数组下标和数组元素值之间的规律即可。
第一种思路:循环数组的下标0-99,则和下标对应的元素的值比数组下标多1。
则实现代码如下:
int[] m = new int[100];
for(int i = 0;i < m.length;i++){
 m = i + 1;
}

代码说明:声明并初始化一个长度是100的数组,使用循环循环数组的下标,下标的区间是[0,m.length-1],其中m.length表示数组的长度。在实际赋值时,把数组的下标做成变量,则当i的值为0时,则m就是m[0],依次类推,按照题目的要求,则数值的规律是i+1,这样循环结束以后,数组m中的值就依次是1-100了。
第二种思路:循环数组的值1-100,则下标比数组的值下1。
则实现的代码如下:
int[] m = new int[100];
for(int i = 1;i <= 100;i++){
 m = i;
}

该代码中循环变量i的值从1循环到100,则数组的下标是i – 1,这样也可以实现题目要求的功能。
6.3.2输出数列
要求:输出1 1 2 3 5 8 13……这样的数列,输出该数列的前20个数字。
该题是一个基本的数字逻辑,在实际解决该问题时,首先要发现该数字的规律,然后按照该规律来设计数组即可。
实现思路:数字的规律是除了数列里的前两个数字以外,其它的数字都满足该数字等于前两个数字的和,由于题目要求输出前20个数字,所以需要一个长度为20的数组,第一个和第二个数字直接赋值,后续的数字通过前两个数字元素得到。
则实现的代码如下:
int[] num = new int[20];
num[0] = 1;
num[1] = 1;
//循环初始化
for(int i = 2;i < num.length;i++){
 num = num + num;
}
//循环输出
for(int i = 0;i < num.length;i++){
  System.out.print(num);
  System.out.print(‘ ‘);
}
System.out.println();//换行

在该代码中,初始化一个长度为20的数组,首先将数组中的前两个元素赋值成1,然后循环对后续的元素的赋值,如果当前元素的下标是i,则它前一个元素的下标是i-1,再前面一个元素的下标是i-2,只需要将这2个元素的值相加,然后赋值给当前元素即可。后面使用一个循环,输出数组中所有的元素,元素和元素之间有一个间隔的空格,在输出所有的元素以后换行。
6.3.3 歌手打分
要求:在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉一个最低分,然后剩余的8位评委的分数进行平均,就是该选手的最终得分。如果已知每个评委的评分,求该选手的得分。
该题实际上涉及到求数组的最大值、最小值,以及求数组中所有元素的和,也是数组方便统计的用途体现。
实现思路:求出数组元素的最大值、最小值以及和,然后使用和减去最大值和最小值,然后除以8获得得分。
则实现的代码如下:
int[] score = {90,78,90,96,67,86,78,92,79,85};//评委打分
int sum = 0;    //存储和
int max =score[0]; //存储最大值
int min = score[0];//存储最小值
//求和
for(int i = 0;i < score.length;i++){
 sum += score;
}
//获得最大值
for(int i = 1;i < score.length;i++){
 //比较
 if(max < score){  max = score;
 }
}
//获得最小值
for(int i = 1;i < score.length;i++){
 //比较
 if(min > score){ min = score;
 }
}
//计算平均分
double avg = (sum – max – min)/8.0;
System.out.println(avg);

在该代码中,实现数组求和的思路和以前的一样,就是每次加一个元素,然后用得到的结果再和后续的元素依次相加。求最大值的思路是首先假设第一个元素最大,把score[0]赋值给max,然后使用max的值和后续依次比较,如果后续的元素比max大,则把该值赋值给max,然后再和后续的元素比较,求最小值的思路和最大值的思路一样。然后计算平均分就完成了题目的要求。
该代码虽然结构比较清晰,但是效率不高,为了追求效率,可以把以上三个循环合并起来,代码如下:
for(int i = 0;i < score.length;i++){
 sum += score; //求和
 //获得最大值
 if(max < score){ max = score;}
 //获得最小值
 if(min > score){ min = score;}
}

这样虽然在结构上稍微复杂了一些,但是效率得到了改善。在实际编写程序时,一般会在功能书写完成以后,对代码进行优化,提高程序的执行效率。
6.3.4 判断数组元素是否重复
要求:判断一个数组中是否存在相同的元素,如果存在相同的元素则输出“重复”,否则输出“不重复”。
该题中如果需要判断数组中元素是否重复,则需要对数组中的元素进行两两比较,如果有任意一组元素相等,则该数组中的元素存在重复,如果任意一组元素都不想等,则表示数组中的元素不重复。
实现思路:假设数组中的元素不重复,两两比较数组中的元素,使用数组中的第一个元素和后续所有元素比较,接着使用数组中的第二个元素和后续元素比较,依次类推实现两两比较,如果有一组元素相同,则数组中存储重复,结束循环。把比较的结果存储在一个标志变量里,最后判断标志变量的值即可。
则实现的代码如下:
int[] n = {1,2,3,1,0};
boolean flag = true;  //假设不重复
for(int i = 0;i < n.length – 1;i++){ //循环开始元素
 for(int j = i + 1;j < n.length;j++){ //循环后续所有元素
  //如果相等,则重复
  if(n == n[j]){
   flag = false;//设置标志变量为重复
   break;   //结束循环
  }
 }
}
//判断标志变量
if(flag){
 System.out.println(“不重复”);
}else{
 System.out.println(“重复”);
}

在该代码中,flag变量存储是否重复,true代表不重复,false代表重复。外部循环中循环变量i代表第一个元素的下标,内部循环中循环变量j代表后续元素的下标,当i为零时和后续所有元素比较,然后当i为1时也和后续所有元素比较,依次类推,这样实现所有元素之间的两两比较。然后如果元素相同,则代表有重复,把flag变量的值置成flase,结束循环。最后根据flag变量的值就可以判断是否重复了。
6.3.5 判断数组是否对称
要求:判断数组元素是否对称。例如{1}、{1,2,0,2,1},{1,2,3,3,2,1}这样的都是对称数组。
该题中用于判断数组中的元素关于中心对称,也就是说数组中的第一个元素和最后一个元素相同,数组中的第二个元素和倒数第二个元素相同,依次类推,如果比较到中间,所有的元素都相同,则数组对称。
实现思路:把数组长度的一半作为循环的次数,假设变量i从0循环到数组的中心,则对应元素的下标就是数组长度-i-1,如果对应的元素有一组不相等则数组不对称,如果所有对应元素都相同,则对称。
则实现的代码如下:
int[] n = {1,2,0,2,1};
boolean flag = true;//假设对称
for(int i = 0;i < n.length/2;i++){ //循环数组长度的一半次
 //比较元素
 if(n != n[n.length – i – 1]){
  flag = false;  //不对称
  break;    //结束循环
 }
}
if(flag){
  System.out.println(“对称”);
}else{
  System.out.println(“不对称”);
}

在该代码中,flag作为标志变量,值为true代表对称,false代表不对称,因为是两两比较,只需要比较数组的长度一半次即可,如果对应的元素不相同则数组不对称,结束循环。最后判断标志变量的值,就可以获得数组是否对称了。

最新回复 (26)
全部楼主
返回
发新帖
我也是有底线哒~