5.1 数组
5.1.1 初识数组
5.1.2 创建数组
定义数组变量:
-
<类型>[] <名字>= new <类型>[元素个数];
-
int[] grades = new int[100];
-
double[] averages = new double[20];
-
元素个数必须是整数
-
元素个数必须给出
-
元素个数可以是变量
5.1.3 数组的元素
有效的下标:
- 最小的下标是0,最大的下标是数组的元素个数-1
- 可是编译器不会检查看你是否用了有效的下标
- 但是如果运行的时候出现了无效的下标
- 但是如果运行的时候出现了无效的下标,可能会导致程序终止
length:
- 每个数组有一个内部成员length,会告诉你它的元素的数量
- 这样的程序具有可扩展性
for ( i = 0; i < 100; ++i )
sum += grade[i];
最好是:
for ( i = 0; i < grade.length; ++i )
sum += grade[i];
5.1.4 数组变量
直接初始化数组:
- new创建的数组会得到默认的0值
- int [] scores = {87,98,69,54,65,76,87,99}
- 直接用大括号给出数组的所有元素的初始值
- 不需要给出数组的大小,编译器替你数数
- 如何得到数组的大小?length!
Scanner in = new Scanner(System.in);
int [] scores = {87,98,69,54,65,76,87,99};//这样如果需要再加减数组内的元素,就很方便
System.out.println(scores.length);
for ( int i = 0; i < scores.length; i++)
{
System.out.print(scores[i]+" ");
}
Java的核心问题:
Scanner in = new Scanner(System.in);
int[] a = new int [10];
a[0] = 5;
int[] b = a;
b[0] = 16;
System.out.println(a[0]);
下图手写笔记是对上面代码块的解释
数组变量:
- 数组变量是数组的管理者而非数组本身
- 数组必须创建出来然后交给数组变量来管理
- 数组变量之间的赋值是管理权限的赋予
- 数组变量之间的比较是判断是否管理同一个数组
复制数组:
- 必须遍历源数组将每个元素逐一拷贝给目的数组
int [] a = {1,2,3,4,5};
int [] b = new int [a.length];
for ( int i = 0; i < b.length; i++ )
b[i] = a[i];
5.2 数组计算
5.2.1投票统计
- 写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一次数字出现的次数,输入-1表示结束
int [] numbers = new int[10];
int x;
x = in.nextInt();
while ( x != -1)
{
if ( x >= 0 && x <= 9)
{
numbers[x]++;
}
x = in.nextInt();
}
for ( int i = 0; i < numbers.length; i ++ )
{
System.out.println(i+":"+numbers[i]);
}
5.2.2 遍历数组
搜索
- 在一组给定的数据中,如何找出某个数据是否存在?
//普通循环
int [] data = {2,3,5,7,4,9,11,34,12,28};
int x = in.nextInt();
int loc = -1;
for ( int i = 0; i < data.length; i ++)
{
if ( x == data[i])
{
loc = i;
break;
}
}
if ( loc > -1 )
{
System.out.println(x+"是第"+(loc+1)+"个");
}
else
{
System.out.println(x+"不在其中");
}
遍历数组
- 通常都是使用for 循环,让循环变量i从0到<数组的length,这样循环体内最大的i正好是数组最大的有效下标
- 常见的错误是:
- 循环结束条件是<=数组长度
- 离开循环后,继续用i的值做数组元素的下标
for-each 循环
for ( <类型> <变量> : <数组> ){
...
}
//for each 循环
int [] data = {2,3,5,7,4,9,11,34,12,28};
int x = in.nextInt();
boolean found = fales;
for ( int k : data )
{
if ( x == k )
{
found = true;
break;
}
}
if ( found )
{
System.out.println(x+"在其中");
}
else
{
System.out.println(x+"不在其中");
}
5.2.3数组的例子:素数
判断是否能被已知的且<x的素数整除
- 构造前50个素数的表
int [] primes = new int [50];
primes[0] = 2;
int cnt = 1;
MAIN_LOOP:
for ( int x = 3; cnt < primes.length; x++ )
{
for ( int i = 0; i < cnt; i++ )
{
if ( x % primes [i] == 0)
{
continue MAIN_LOOP;
}
}
primes[cnt++] = x;
}
for ( int k : primes )
{
System.out.println(k+"");
}
System.out.println();
构造素数表
- 欲构造n以内的素数表
- 令x为2
- 将2x、3x、4x直至ax<n的数标记为非素数
- 令x为下一个没有标记为非素数的数,重复2;直到所有的数都已经尝试完毕
- 欲构造n以内(不含)的素数表
- 创建prime为boolean[n],初始化其所有元素为true,prime[x]为true表示为x是素数
- 令x=2
- 如果x是素数,则对于(i=2;xi<n;i++)令prime[ix]=false
- 令x++,如果x<n,重复3,否则结束
boolean [] isPrime = new boolean[100];
for ( int i = 2; i < isPrime.length; i++ )
{
isPrime[i] = true;
}
for ( int i = 2; i < isPrime.length; i++ )
{
if ( isPrime[i] )
{
for( int k = 2; i*k < isPrime.length; k++ )
{
isPrime[i*k] = false;
}
}
}
for ( int i = 0; i < isPrime.length; i++ )
{
if ( isPrime[i] )
{
System.out.println(i+" ");
}
}
System.out.println();
5.3 二维数组
5.3.1 二维数组
二维数组
- int [][] a = new int [3][5];
- 通常可以理解为a是一个3行5列的矩阵
二维数组的遍历
for ( i = 0; i < 3; i++ ){
for ( j = 0; j < 5; j++){
a[i][j] = i*j;
}
}
- a[i][j]是一个int
- 表示第i行第j列上得到单元
- a[i,j]并不存在
二维数组的初始化
int [][] a = {
{1,2,3,4},
{1,2,3},
};
- 编译器来数数
- 每行一个{}。逗号分隔
- 最后的逗号可以存在,有古老的传统
- 如果省略,表示补零
井字棋游戏
- 读入一个3X3的矩阵,矩阵中的数字为1表示该位置上有一个X,为0表示为O
- 程序判断这个矩阵中是否有获胜的一方,输出表示获胜的一方的字符X或O,或输出无人获胜