序列( Sequence),就是依次排列的多个对象。两种典型的序列:向量( Vector)和列表( List)。
3.1 向量与数组
通过[0, n-1]之间的每一个整数,都可以直接访问到唯一的元素 e,而这个整数就等于 S 中位于 e 之前的元素个数⎯⎯在此,我们称之为该元素的秩( Rank)。
3.1.1 向量 ADT
操作方法 | 功能描述 |
---|---|
getSize(): | 报告向量中的元素数目 输入:无 输出:非负整数 |
isEmpty(): | 判断向量是否为空 输入:无 输出:布尔量 |
getAtRank®: | 若 0 ≤ r < getSize(),则返回秩为 r 的那个元素 否则,报错 输入:一个整数 输出:对象 |
replaceAtRank(r, e): | 若 0 ≤ r < getSize(),则将秩为 r 的元素替换为 e,并返回原来的元素 否则,报错 输入:一个整数和一个对象 输出:对象 |
insertAtRank(r, e): | 若 0 ≤ r ≤ getSize(),则将 e 插入向量中,作为秩为 r 的元素(原秩不小于 r 的元素顺次后移);并返回该元素 否则,报错 输入:一个整数和一个对象 输出:对象 |
removeAtRank®: | 若 0 ≤ r < getSize(),则删除秩为 r 的那个元素并返回之(原秩大于 r 的元素顺次前移) 否则,报错 输入:一个整数 输出:对象 |
一种直截了当的方法就是采用数组来实现向量:下标为r的数组项,就对应于秩为r的元素。
3.1.2 基于数组的简单实现
public class ExceptionBoundaryViolation extends RuntimeException {
public ExceptionBoundaryViolation(String message) {
super(message);
}
}
向量接口:
public interface Vector {
// 返回向量中元素数目
public int getSize();
// 判断向量是否为空
public boolean isEmpty();
/**查改增删*/
// 取秩为r的元素
public Object getAtRank(int r) throws ExceptionBoundaryViolation;
// 将秩为r的元素替换为obj
public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation;
// 插入obj,作为秩为r的元素;返回该元素
public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation;
// 删除秩为r的元素
public Object removeAtRank(int r) throws ExceptionBoundaryViolation;
}
/*
* 基于数组的向量实现
*/
public class Vector_ExtArray implements Vector {
private int N = 8;// 数组的容量,可不断增加
private int n;// 向量的实际规模
private Object A[];// 对象数组
public Vector_ExtArray() {
A = new Object[N];
n = 0;
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return n;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return (0 == n) ? true : false;
}
@Override
public Object getAtRank(int r) throws ExceptionBoundaryViolation {
if (0 > r || r >= n)
throw new ExceptionBoundaryViolation("意外:秩越界");
return A[r];
}
@Override
public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation {
if (0 > r || r >= n)
throw new ExceptionBoundaryViolation("意外:秩越界");
/*
* A[r] = obj; return A[r];
*/
Object bak = A[r];
A[r] = obj;
return bak;
}
@Override
public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation {
if (0 > r || r > n)
throw new ExceptionBoundaryViolation("意外:秩越界");
if (N < n) {
// 数组容量小于实际规模
N *= 2;
Object B[] = new Object[N];// 开辟一个容量加倍的数组
for (int i = 0; i < n; i++) {
B[i] = A[i];
}
A = B;// 用B替换A(原A[]将被自动回收)
}
for (int i = n; i > r; i--)
A[i] = A[i - 1];// 后续元素顺次后移
A[r] = obj;// 插入
n++;// 更新当前规模
return obj;
}
@Override
public Object removeAtRank(int r) throws ExceptionBoundaryViolation {
if (0 > r || r >= n)
throw new ExceptionBoundaryViolation("意外:秩越界");
Object bak = A[r];
for (int i = r; i