1.理解数组
例:存储50个学生某门课程的成绩并求50人的平均分。
分析:可以定义50个变量,分别存放50个学生的成绩。
int score1=95;
int score2=90;
...
int score50=60;
double average=(score1+...+score50)/50;
System.out.print("平均成绩为:"+average);
该例的代码缺陷很明显,首先是定义的变量个数太多,如果存储10000个学生的成绩,难道真定义10000个变量吗?显然不可能。另外也不利于数据处理,如要求计算所有成绩之和或最高分,要输出所有成绩,就需要把所有的变量名都写出来,这显然不是一种好的实现方法。
java针对此类问题提供了有效的存储方式——数组。在Java中,数组是用来存储一组相同类型数据的数据结构。当数组初始化完毕后,Java为数组在内存中分配一段连续的空间,其在内存中开辟的空间也将随之固定,此时数组的长度就不能再发生改变。即使数组中没有保存任何数据,数组所占据的空间依然存在。
//声明
int[] a;
String b[];
double []c;
// 分配空间,使用New关键字来分配空间,new关键字是java中优先级最高的
a=new int[5];
b=new String[6];
c=new double[4];
//赋值,并不一定把5个全部赋值
a[0]=10;
a[1]=14;
a[2]=18;
a[3]=24;
a[4]=33;
//声明的同时分配空间
char[] ch=new char[10];
float f[]={11.1f,22.2f};//声明分配空间并赋值
int []d=new int[]{1,2,3};//基本不用
/*int[] g;
g={1,2,3};使用大括号不能分开,必须一次性做完*/
2.定义数组(声明的同时分配空间)
在Java中,定义数组的语法有如下两种。
数据类型 [] 数组名=new 数据类型[数组长度];
或者:
数据类型 数组名 [] =new 数据类型 [数组长度];
(1)定义数组时一定要指定数组名和数组类型。
(2)必须书写“[]”,表示定义了一个数组,而不是一个普通的变量。
(3)“[数组长度]”决定连续分配的空间的个数,通过数组的length属性可获取此长度。
(4)数组的数据类型用于确定分配的每个空间的大小。
例:使用两种语法分别定义整型数组scores与字符串数组cities,scores的长度是5,cities的长度是6 。
int [] scores=new [5];
String cites []= new String[6];
该例为数组scores分配了5个连续空间,每个空间存储整型的数据,即占用4字节空间,每个空间的值为0 。为数组cites分配了6个连续空间,用来存储字符串类型的数据,每个空间的值是null。
3.数组元素的表示与赋值
由于定义数组时内存分配的是连续的空间,所以数组元素在数组里顺序排列编号,该编号即元素下标,它标明了元素在数组中的位置。首元素的编号 规定为0,因此,数组的下标依次为0,1,2,3,4,…依次递增,每次增长数为1.数组中的每个元素都可以通过下标来访问。例如,数组scores的第一个元素表示为scores[0] 。
获得数组的语法格式如下。
例如,下面两行代码分别为scores数组的第一个元素和第二个元素赋值。
scores[0]=65;//表示为scores数组中的第一个元素赋值65
scores[1]=87;//表示为scores数组中的第二个元素赋值87
4.数组的初始化(声明的同时赋值)
所谓数组的初始化,就是在定义数组的同时一并完成赋值操作。
数组初始化的语法格式如下。
数据类型[]数组名={值1,值2,值3,…,值n};
或者:
数据类型[]数组名=new 数据类型[]{值1,值2,值3,…,值n};
下面两个语句都是定义数组并初始化数组。
int scores[]={75,67,90,100,0};//创建一个长度为5的数组scores
//或者
int scores[]=new int[]{75,67,90,100,0};
//法二
Scanner scores=new Scanner(System.in);
for(i=0;i<30;i++){
scores[i]=scores.nextInt();
}
5.遍历数组
在编写程序时,数组和循环往往结合在一起使用,可以大大地简化代码,提高程序编写效率。通常用for循环遍历数组。
例:创建整型数组,从控制台接受键盘输入的整型数,并对数组进行循环赋值。
实现步骤如下:
(1)创建整型数组。
(2)创建Scanner对象。
(3)将循环变量i作为数组下标,循环接收键盘输入,并为数组元素赋值。
int scores[]= new int[5];//创建长度为5的整型数组
Scanner input=new Scanner(System.in);
for(int i=0;i<scores.length;i++){//scores.length等于数组的长度5
score[i]=input.nextInt();//从控制台接收键盘输入,进行循环赋值
}
该例中使用for循环为数组元素赋值。
例:创建整型数组,循环输出数组元素。
实现步骤如下。
(1)初始化整型数组。
(2)以循环变量i为数组下标,循环输出数组元素。
int scores[]={75,67,90,100,0};//创建有5个元素的整型数组
for(int i=0;i<scores.length;i++){//length等于5
//每次循环i的值相当于数组下标
System.out.println("scores["+i+"]="+scores[i]);
}
for(元素类型 变量名:要循环的数组或集合名){…}
第一个元素类型是数组或集合中元素的类型,变量名再循环时用来保存每个元素的值,冒号后面时要循环的数组或集合名称。
例:创建整型数组,使用增强for循环输出数组元素
分析如下。
该语句的含义是依次取出数组a中各个元素的值并赋给整型变量i,同时输出其值。
实现步骤如下。
(1)初始化整型数组。
(2)使用增强for循环。
public class Review1
public static void main(String args[]){
int []a={1,2,3,4,5};
for(int i:a){
System.out.print(i);
}
}
6.各状态下的数组地址
int[] a=null;
String[] b=new String[3];//String类型的一个位置,分号后面为其地址。
char[] c=new char[3];//char类型可直接打印其位置值
double[] d={1.1,2};
// b[3]="abc";//数组索引超出他的范围异常
// double ddd=1/0;//0为分母
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
例题
例1:计算随机输入三十位同学总分、平均分、最大分、最小分,同时打印每个分数
public class Review2{
public static void main(String args[]){
int scores[]=new int[30];
int max=0;
int min=0;
System.out.print("成绩为:[");
for(int i=0;i<scores.length;i++){
scores[i]=(int) (Math.random()*80+20);//随机输入
System.out.print(scores[i]+" ");
if(scores[i]>max){//计算最大值
max=scores[i];
}
if (scores[i]<min){//计算最小值
min=scores[i];
}
}
System.out.println("]");
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
int sum=0;
for (int i=0;i<scores.length;i++){
sum+=scores[i];
}
double average= (double) sum/scores.length;
System.out.println("总分为:"+sum);
System.out.println("平均分为:"+average);
}
例2:有一组学员的成绩{99,85,82,63, 60},要增加一个学员的成绩,将它插入成绩序列,并保持降序。
int[] a={99,85,82,63,60};
int[] b=new int[6];
for (int i = 0; i < a.length; i++) {
b[i]=a[i];
}
System.out.println(Arrays.toString(b));//转成String,数组遍历
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个数");
int num=sc.nextInt();
boolean isInsert=false;//标志
for (int i = b.length-2; i >=0; i--) {//从后向前走,或者a.length-1
if (num>b[i]){
b[i+1]=b[i];//下标后移
}else {
b[i+1]=num;
isInsert=true;
break;
}
}
if (isInsert==false){//到最后也没地方坐
b[0]=num;//值插在首位
}
System.out.println(Arrays.toString(b));
例3:从数组中删除一个元素
int[] a={99,85,82,63,60};
int[] b=new int[4];
Scanner sc=new Scanner(System.in);
System.out.println("请输入要删除的下标:");
int num=sc.nextInt();
int j=0;
for (int i = 0; i < a.length; i++) {
if (i==num)continue;
b[i]=a[i];
j++;//否则i比j少一个
}
System.out.println(Arrays.toString(a));
例4:选择排序
/*选择排序逻辑:
* 从前向后对每一个下标对应的元素作为基准位
* 与后面所有的元素进行比较,找出最小值
* 与当前下标的元素尽心交换
* 进行下一次循环
* */
/* int []a={1,3,2,5,8,4};
for (int i = 0; i < a.length-1; i++) {//i基准位
int min=a[i];
for (int j = i; j < a.length; j++) {
//j每个在动的
if (a[i]>a[j]){
a[i]=a[j];
a[j]=min;
}
}
}
System.out.println(Arrays.toString(a));*/
int []a={1,3,2,5,8,4};
for (int i = 0; i < a.length-1; i++) {//i基准位
int min=a[i];
int tmp=i;
for (int j = i+1; j < a.length; j++) {
//j每个在动的
if (a[i]>a[j]){
min=a[j];
tmp=j;
}
}
a[tmp]=a[i];
a[i]=min;
}
System.out.println(Arrays.toString(a));
例5:插入排序
/*
* 逻辑:从第二位开始,向前比较,进行插入逻辑
* */
int []a={1,3,2,5,8,4};
for (int i = 1; i < a.length; i++) {
int tmp=a[i];
boolean isInsert=false;
for (int j = i-1; j >=0; j--) {
//如果遇到比自己大的,大的值就后移
if (tmp<a[j]){
a[j+1]=a[j];
}else {
//如果遇到比自己小的,就插入
a[j+1]=tmp;
isInsert=true;
break;
}
}
//如果一直没插入,就插首位
if (!isInsert){//isInsert==false
a[0]=tmp;
break;
}
}
System.out.println(Arrays.toString(a));
例6:遍历数组,求和,猜数字
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个数:");
int s=sc.nextInt();
System.out.print("循环输出:");
int sum=0;
int []a= new int[]{8,4,2,1,23,344,12};
for (int i = 0; i <7 ; i++) {
System.out.print(+a[i]+" ");
sum+=a[i];
}
System.out.println("和为"+sum);
for (int i = 0; i <a.length ; i++) {
if (s==a[i]){
System.out.println("包含此数");
break;
}else {
System.out.println("不包含此数");
break;
}
}