在执行程序的过程中,经常需要存储大量数据,例如需要读取100个数,计算他们的平均值,然后找出有多少个数大于平均值,首先,程序需要读入这些书并计算他们的平均值,然后每个数与平均值及逆行比较判断它是否大于平均值,为了实现这样的功能,我们必须选择将这些数全部存储到变量中,必须声明100个变量,这时候我们需要一个方法,Java语言提供了一种称为数组(array)的数据结构,用它来存储一个元素个数固定且元素类型相同的有序集,在现在的这个例子中,可以将所有的100个数存储在一个数组中,通过一个一维数组变量访问它,解决方案如下:
package analyzenumbers;
import java.util.Scanner;
/**
*
* @author john
*/
public class AnalyzeNumbers {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
final int NUMBER_OF_ELEMENTS=100;
double[]numbers=new double[NUMBER_OF_ELEMENTS];
double sum = 0;
Scanner input = new Scanner(System.in);
for(int i=0;i<NUMBER_OF_ELEMENTS;i++){
System.out.println(\”Enter a number:\”);
numbers[i]= input.nextDouble();
sum = sum+numbers[i];
}
double average = sum/NUMBER_OF_ELEMENTS;
int count = 0;
for(int i =0;i<NUMBER_OF_ELEMENTS;i++)
{
if(numbers[i]>average)
count++;
}
System.out.println(\”Average is\”+average);
System.out.println(\”Number of elements above the average is\”+count);
}
}
我们这个程序创建了一个有100个元素的数组,并将这些数存储在数组中,将每个数加到sum中,并获得其平均值,之后将数组中的每个数和平均值进行比较。
数组是用来存储数据的集合,但是我们通常将数组看作一个存储具有相同类型的变量集合,我们无须声明每个单个变量,只要声明一个数组变量,并用numeber[0],number[1]等等来表示单个变量。
1.声明数组变量
为了在程序中使用数组,必须声明一个引用数组的变量,并指明数组的元素类型,下面是声明数组变量的语法
elementType[]arrayRefvar;
elementType可以是任意数据类型,但是数组中所有的元素都必须具有相同的数据类型,arrayRefvar为引用的数据变量,例如 double[]mylist
2.创建数组
不同于基本数据类型变量的声明,声明一个数组变量并不在内存中给数组分配任何空间。它只是创建一个对数组引用的存储位置,如果变量不包含对数组的引用,那么这个变量的值为null,我们可以将声明一个数组变量,创建数组,将数组引用赋值变量合并在一起,例如:double[] mylist = new double[10],这句话生命了数组变量mylist,创建了一个由十个double型元素构成的数组,并将该数组的引用赋值给mylist,我们可以使用下面的语法对数组进行赋值,mylist[0]=5.6;
3.数组大小
当给数组分配空间时,必须通过指定该数组能够存储的元素个数来确定数组大小,创建数组后就不能再修改他的大小,我们可以使用arrayRefvar.length来求得数组大小,例如mylist.length为10.
4.数组下标变量
数组元素可以通过下标访问,数组下标是基于0的,也就是说,其范围是从0开始到arrayRefvar-1结束的,例如mylist包含10个double值,而下标从0到9,mylist[9]表示数组的最后一个元素
5.数组初始化语法及处理数组
Java有一个简洁的记法,可以直接声明,创建并初始化。例如 double[]mylist = {1.0,2.0,3.0,4.0},这种初始化雨打中不适用运算符new,使用数组初始化语法时,必须将声明变量,创建和初始化都放在一条语句中,分开会产生语法错误。
当我们在处理数组元素时,经常会用到for循环:
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.println(\”Enter\”+mylist.length+\”values:\”);
for(int i=0;i<mylist.length;i++)
mylist[i]=input.nextDouble();
我们通过一个具体的例子来使用数组,我们选择乐透号码问题,假如我买了号码,希望它覆盖1到99的所有数字,我们输入数字,检查是否覆盖所有号码,最后一个数字以0结束。
在写程序之前,我们要先想好算法,我们可以创建一个布尔元素构成的数组,初始状态是,每个元素都是false,当读取一个数时,它对应的元素设置为true。我们从键盘读取每个数字k,通过isCovered[k-1]设置为true将数字k设置为覆盖的,之后if每个isCovered[i]都为true,那么该筹码覆盖所有数字,否则没有覆盖,程序清单如下:
package lottonumbers;
import java.util.Scanner;
/**
*
* @author john
*/
public class LottoNumbers {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Scanner input = new Scanner(System.in);
boolean[]isCovered = new boolean[99];
int number =input.nextInt();
while(number!=0){
isCovered[number-1]=true;
number = input.nextInt();
}
boolean allCovered = true;
for(int i=0;i<99;i++)
if(isCovered[i]!=true){
allCovered=false;
break;
}
if (allCovered)
System.out.println(\”The tickets cover all numbers \”);
else
System.out.println(\”The tickets not cover all numbers \”);
}
}
程序正确执行,解决问题。如果我们已经创建了一个名为LottoNumbers.txt的文本文件,该文件包括值以及末尾为0,可以下面的命令运行该程序:
Java LottoNumbers < LottoNumbers.txt