第八章 数组和向量
数组和向量——主要内容
数组介绍
声明、创建、初始化数组
使用对象作为数组元素
复制数组多维数组
命令行参数
创建通用类
Vector 类
1.数组介绍
数组是一个数据结构,用来存储相同类型的数据
Java将数组作为对象来处理
具有10个double类型的数组
double[] myList = new double[10]

2.声明数组
datatype[] arrayname;
例子:
int[] myList;
datatype arrayname[];
例子:
int myList[];
创建数组
arrayName = new datatype[arraySize];
例子:
myList = new double[10];
声明和创建一步完成
datatype[] arrayname = new
datatype[arraySize];
double[] myList = new double[10];
datatype arrayname[] = new
datatype[arraySize];
double myList[] = new double[10];
数组初始化
默认初始化
数组创建后,它的元素会按默认值进行初始化
使用循环
for (int i = 0; i < myList.length; i++)
myList[i] = (double)i;
声明, 创建, 初始化一步完成
double[] myList = {1.9, 2.9, 3.4, 3.5};
示例:划分成绩等级
在这个例子中,程序能够通过从键盘读入的学生成绩(int),挑选最好的成绩,并且根据下表确定等级
如果分数>=最高分数-10,等级为 A;
如果分数>=最高分数-20,等级为 B ;
如果分数>=最高分数-30,等级为 C ;
如果分数>=最高分数-40,等级为 D ;
其他情况为E ;

运行结果

3.数组的排序
举例1:选择排序法
示例:使用数组排序
在这个例子中使用selectionSort方法来编写程序,实现对一个double型浮点数列表排序

数组中元素的查找
举例2:线性查找法和二分查找法
示例:测试线性查找
在这个例子中,编写程序实现并测试线性查找法。该程序创建一个包含10个int型随机数的数组并显示它。并且提示用户输入要查询的关键字并进行线性查找。

示例:测试二分查找
在例子中,编写程序实现并测试二分查找法。
使用二分查找法,前提是数组中元素已经排好序:
如果key比中间元素小,则在前半段进行查找
如果key等于中间元素,则匹配成功,查找结束
如果key比中间元素大,则在后半段进行查找

4.对象的数组
声明和创建
Circle[] circleArray = new Circle[10];
初始化
for (int i=0; i<circleArray.length; i++)
{ circleArray[i] = new Circle(); }
示例:累加圆的面积
在这个例子中,编写程序累加一组圆的面积

运行结果

5.数组的复制
List2 = List1?
数组的复制
使用循环
int[] sourceArray = {2, 3, 1, 5, 10};
int[] targetArray = new int[sourceArray.length];
for (int i = 0; i < sourceArrays.length; i++)
targetArray[i] = sourceArray[i];
使用clone方法
int[] targetArray = (int[])sourceArray.clone();
数组的复制(续)
使用System的静态arraycopy 方法
arraycopy(sourceArray, src_pos, targetArray, tar_pos, length);
例如
System.arraycopy(sourceArray, 0, targetArray, 0, sourceArray.length);
Arraycopy方法没有给目标数组分配内存空间,复制之前必须创建目标数组并分配内存,复制之后,sourceArray和targetArray分别占用独立的内存空间
6.多维数组
在Java中二维数组被声明为数组对象的数组
int[][] matrix = new int[10][10];或者
int matrix[][] = new int[10][10];
二维数组的初始化
for (int i=0; i<matrix.length; i++)
{for (int j=0; j<matrix[i].length; j++)
{ matrix[i][j] = (int)(Math.random()*1000); }}
多维数组的初始化
可以在创建的同时初始化一个二维数组
int[][] matrix =
{1,2,3,4,5},
{2,3,4,5,6},
{3,4,5,6,7},
{4,5,6,7,8},
{5,6,7,8,9}}
示例:两个矩阵的加法和乘法
在这个例子中,使用二维数组创建两个矩阵,并进行加法和乘法运算

运行结果

7.命令行参数
向Java程序传递参数
命令行参数
class TestMain
public static void main(String[] args)
{ ... }}
java TestMain arg0 arg1 arg2 ... argn
处理命令行参数
在main方法内部,
从 args[0], args[1], ..., args[n]获得命令行参数 arg0, arg1, ..., argn.
送给主程序的参数储存在字符串数组args中,在命令行中第一个参数用args[0]表示,第二个参数用args[1]表示,…..第n+1个用args[n]表示,args.n是传递参数的数量
示例:使用命令行参数
在这个例子中,编写一个程序,用来进行整数的二元运算。程序接收三个参数:一个操作符和两个整数

示例:设计通用类
在这个例子中给出了一个用于矩阵算术运算的通用类。该类实现了对所有类型矩阵通用的加法和乘法运算

示例:设计通用类(续1)

示例:设计通用类(续2)
在这个例子中,给出了两个程序,利用GenericMatrix类来实现integer matrix 和rational matrix 的运算

第二部分:向量类(Vector)
Java在java.util包中提供了向量类Vector,
它可以存储数目不确定的元素;
可以根据需要进行动态伸缩
1. 创建和使用向量类
创建Vector类,使用它的默认构造方法
Vector vector = new Vector();
给向量添加元素,使用addElement方法
vector.addElement(anObject);
在向量中元素一定是对象.上述方法将元素追加到向量末尾
创建和使用向量类(续)
检索向量的元素,使用elementAt方法
Object anObject = vector.elementAt(0);
计算向量中元素的个数,使用size方法
int numOfElements = vector.size();
其它方法
insertElementAt(Object obj,int index)
setElementAt(Object obj,int index)
removeElementAt(int index)……
示例:使用向量划分等级
在这个例子中使用向量代替数组, 该程序从键盘读入学生成绩并将分数存储在向量中,找到最高分并划分所有学生的成绩级别

小结
熟练使用数组
熟练使用向量
作业描述:粒子的移动和碰撞模型
为了简化,研究二维平面上粒子集合内粒子的碰撞每个粒子作为一个具有质量m的点,并以速度v移动,中心点的坐标为r(x,y)
粒子以匀速运动,直到发生碰撞,r(t+t')=r(t)+t'*v
通过离散的时间点对粒子状态进行观测,计算位置,速度
两个粒子间的距离小于某个值时发生碰撞,每种粒子的散射角度不同,并根据散射角度计算碰撞后的速度;
多个粒子碰撞时,只考虑前两个粒子的碰撞
发生碰撞后,我们利用碰撞规则计算碰撞后粒子的速度和运动方向
当两个粒子发生碰撞后,距离3倍碰撞半径以后才能再次发生碰撞
粒子在一个方形区域内进行移动和碰撞,超出此区域则不考虑
第一部分:实现相同种类粒子间的碰撞,要得出每个粒子的碰撞次数、最后一次碰撞位置,最后一次碰撞时间。
第二部分:实现两种不同粒子A,B间的碰撞,碰撞会有三种情况:AA,BB,AB,散射角度各不相同
寻找类:
名词:
粒子,粒子集合,平面,质量,点,速度,坐标,离散时间点,距离,区域,碰撞次数、最后一次碰撞位置,最后一次碰撞时间
动词:移动,碰撞,碰撞规则,计算速度,计算位置
类:
点:
属性:坐标,距离;
方法:计算两点距离;
粒子:
属性:质量,点,速度,离散时间点,碰撞角度,碰撞半径,时间增量,碰撞次数、最后一次碰撞位置,最后一次碰撞时间
方法:碰撞规则,移动(计算位置)
区域:
属性:区域的坐标;
方法:粒子是否位于区域内
速度:
属性:速度向量
方法:计算速度
粒子集合
属性:粒子,粒子间的冲突关系
方法:活跃粒子数,粒子是否在区域内,检测所有粒子间的冲突情况,计算粒子碰撞后的状态
系统:
计算整个粒子集合中每个粒子的碰撞次数、最后一次碰撞位置,最后一次碰撞时间
属性要设置成私有
每个属性都要有get和set方法
To string,equal等重载方法


