一、数组使用时的常见错误
1、索引越界错误
public class Test04{
public static void main(String[] args){
int[] arr = {
10, 20, 30};
System.out.println("arr[0]= " + arr[0]);
System.out.println("arr[1]= " + arr[1]);
System.out.println("arr[2]= " + arr[2]);
System.out.println("arr[3]= " + arr[3]);
}
}
如上代码中,arr[3]应该是越界了的,数组中只有3个元素,因此会出现越界错误。但在编译时系统不会报错,而在运行时才会报错。
2、空指针异常
public class Test04{
public static void main(String[] args){
int[] arr = {
10, 20, 30};
arr = null; //将数组的地址定义为空
System.out.println(arr[0]);
}
}
如上代码,就在某处将数组的地址指向空了,因此会导致空指针异常,数组的值也就找不到了。同样在编译时不会报错,而是在运行时才会报错。
二、数组的操作案例
1、数组遍历
public class Test04{
public static void main(String[] args){
int[] arr = {
11, 22, 33, 44, 55};
System.out.println("数组中所有元素有:");
for(int i=0; i<arr.length; i++){
System.out.println("arr[" + i + "]= " + arr[i]);
}
System.out.println("There is bottom!");
}
}
主要有2个点:使用for循环进行遍历,可以同时获得下标和数组值;通过arr.length
可以获得数组的长度。
2、获取最值
(1)分析
定义一个变量,用于保存最大值(或最小值);
取数组中第一个数据作为变量的初始值;
与数组中剩余的数据逐个比对。
(2)练习代码
public class Test04{
public static void main(String[] args){
int[] arr = {
11, 33, 55, 22, 44};
int max = arr[0];
System.out.println("数组中所有元素最大的值为:");
for(int i=1; i<arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
System.out.println(max);
System.out.println("There is bottom!");
}
}
3、数组元素求和
(1)分析
①创建键盘录入对象,准备键盘录入
②定义一个求和变量,准备记录累加后的结果
③动态初始化一一个长度为5的int数组,准备存储键盘录入的数值
④将键盘录入的数值存储到数组中
⑤遍历数组,取出每一个元素, 并求和
⑥输出总和
(2)练习代码
public class Test04{
public static void main(String[] args){
int[] arr = {
11, 33, 55, 22, 44};
int sum = 0; //定义存放求和的值,初值为0
System.out.println("数组中所有元素的和为:");
for(int i=0; i<arr.length; i++){
sum += arr[i]; //每次都加上数组元素的值
}
System.out.println(sum);
System.out.println("--------------This is bottom!--------------");
}
}
4、数组查找(返回索引值即位置)
(1)分析
①定义一个数组,用静态初始化完成数组元素的初始化;
②键盘录入要查找的数据,用一一个变量接收;
③定义一个索引变量,初始值为-1;
④遍历数组,获取到数组中的每一个元素;
⑤拿键盘录入的数据和数组中的每一个元素进行比较,如果值相同,就把该值对应的索引赋值给索引变量,并结束循环
⑥输出索引变量。
(2)练习代码
import java.util.Scanner; //需要用户输入
public class Test04{
public static void main(String[] args){
Scanner sc = new Scanner(System.in); //实例化用户输入的对象sc
int[] arr = {
11, 33, 55, 22, 44}; //定义数组
int index = -1; //定义存放查找到的索引值
System.out.print("请输入你需要查找的值(11, 33, 55, 22, 44): "); //提示用户出入
int data = sc.nextInt();
for(int i=0; i<arr.length; i++){
if(arr[i] == data){
index = i; //若满足查找条件,则赋值遍历到的下标给index索引变量
break; //同时跳出循环
}
}
System.out.println(data + "在数组中的第" + (index+1) + "个位置。");
System.out.println("--------------This is bottom!--------------");
}
}
三、评委打分案例(综合)
1、需求
在编程竞赛中,有5个评委为参赛的选手打分,分数为0- 100的整数分。
选手的最后得分为去掉一个最高分和一 个最低分后的3个评委平均值(不考虑小数部分)。
2、步骤分析
① 定义一个数组,用动态初始化完成数组元素的初始化,长度为5
② 键盘录入评委分数
③ 由于是5个评委打分,所以,接收评委分数的操作,用循环
④ 求出数组最大值
⑤ 求出数组最小值
⑥ 求出数组总和
⑦ 按照计算规则进行计算得到平均分
⑧ 输出平均分
3、练习代码
import java.util.Scanner; //需要用户输入
public class Test04{
public static void main(String[] args){
//对象声明
Scanner sc = new Scanner(System.in); //实例化用户输入的对象sc
//变量定义
int[] arr = new int[5]; //用动态法初始化数组
int index = -1; //定义存放查找到的索引值
int max; //存放最大值
int min; //存放最小值
int sum=0; //存放总分和(所有评委)
int sum2=0; //存放总分和(去掉最大值最小值)
int ave; //存放平均分
//获取评委分数
for(int i=0; i<5; i++){
System.out.print("请输入第 " + i + "次评分:"); //提示用户输入
int score = sc.nextInt();
//判断输入的分数是否规范
if(score>=0 && score<=10){
arr[i] = score; //把获取的分数放到定义好的数组arr中
}else{
System.out.println("输入分数不规范,请重新输入!");
i--; //同时i--,这样可以保证每个评委都输入正确分数再进行计算
}
}
//找出评委分数的最大值和最小值
max = arr[0]; //首先让最大值和最小值都等于初值
min = arr[0];
for(int i=1; i<arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
if(arr[i] < min){
min = arr[i];
}
}
//对评委分数进行求和:不加最大值和最小值
for(int i=0; i<arr.length; i++){
if(arr[i] == max || arr[i]==min){
sum += arr[i]; //5位评委的总分
continue; //若是最大值或最小值,则该次循环不继续
}else{
sum2 += arr[i]; //去掉最大值最小值的总分
sum += arr[i]; //5位评委的总分
}
}
//对评委分数求平均值:去掉最高分和最低分总分/评委个数
ave = sum2/3;
//对计算结果进行输出
System.out.println("评委分数的max= " + max);
System.out.println("评委分数的min= " + min);
System.out.println("5位评委分数的总分为:" + sum);
System.out.println("去掉最高分和最低分后评委总分为:" + sum2);
System.out.println("去掉最高分和最低分后平均分为:" + ave);
System.out.println("--------------This is bottom!--------------");
}
}