以下是实现一个动态顺序表需要支持的接口:
- 打印顺序表
- 在pos位置新增元素
- 判定是否包含某个元素
- 查找某个元素对应的位置
- 获取pos的位置
- 给pos位置的元素设为value
- 删除第一次出现的关键字key
- 获取顺序表长度
- 清空顺序
package gyy;
public class SeqList{
private int[] datas=new int[100];
private int size=0;//size是容量(能最大容纳的元素个数)
//data.length是长度(有效元素的个数)
public int getsize() {
return size;
//size这个成员只能提供get方法,不能提供set方法
//size是通过后面是增删的方法来维护的。
}
public void display() {
//一次打印出每个元素
//形如:[1,2,3,4]
String result="[";
for(int i=0;i<size;i++) {
result+=datas[i];
if(i<size-1) {
result +=",";
}
}
result +="]";
System.out.println(result);
}
//pos表示新元素要插入的位置(下标)
//datas表示新元素的值
public void add(int pos,int data) {
//判定pos是否是有效的值
//写代码的时候要时刻关注参数的有效性
if(pos<0||pos>size) {
return;
}
//扩容的支持,顺序表的容量如果不够用了,就能自动扩容
if(size>=datas.length) {
//需要扩容的条件;
int[] newDatas =new int[2*datas.length];
for(int i=0;i<datas.length;i++) {
newDatas[i]=datas[i];//一个简单的数组拷贝
}
datas=newDatas;
}
//这样的赋值完成之后,new int[100]这个数组就没有引用指向它了
//此时就会被GC(垃圾回收机制)判定成这是一块垃圾,自动回收掉这个内存
//顺序表的扩容策略是非常灵活的,可以根据实际情况来确定哪一种方法合适
//1、尾插(比较简单)
//把这个新元素放到下标为size的位置上!
if(pos==size) {
this.datas[pos]=data;
size++;
return;
}
//2、普通位置的插入;需要搬运
//(插入时必须从后往前搬运)
//i也需要搬运!!!
for(int i=size-1;i>=pos;i--) {
datas[i+1]=datas[i];
}
datas[pos]=data;
size++;
}
public boolean contains(int toFind) {
//循环访问每个元素并进行比较,
//如果发现某个元素和toFind相等,就找到了,返回true
//如果所有元素都找完了,也没有找到下相等 的,就返回false
for(int i=0;i<size;i++) {
if(datas[i]==toFind) {
return true;
}
}
return false;
}
public int search(int toFind) {
for(int i=0;i<size;i++) {
if(datas[i]==toFind) {
return i;
}
}
return -1;
}
public int getPos(int pos) {
return datas[pos];
}
public void setPos(int pos,int data) {
datas[pos]=data;
}
public void remove(int toRemove) {
//先找到toRemove对应的下标
//如果下标是最后一个元素,直接尾删即可
//如果下标是中间元素,需要先搬运,再删除
int pos=search(toRemove);
if(pos==-1) {
//没找到,要删除的元素不存在
return;
}
if(pos==size-1) {
size--;
return;
}
for(int i=pos;i<size-1;i++) {
datas[i]=datas[i+1];
}
size--;
}
public void clear() {
size=0;
}
}
测试代码部分:
public class Test {
private static void addTest() {
//更严谨的测试方法
//
SeqList seqList=new SeqList();
seqList.add(0,100);
seqList.add(0,200);
seqList.add(0,300);
seqList.add(0 ,400);
seqList.display();
//对照着代码进行测试:白盒测试
//不看代码,对照着需求文档测试:黑盒测试
//测试开发
}
private static void containsTest() {
SeqList seqList=new SeqList();
seqList.add(0,1);
seqList.add(0,2);
seqList.add(0,3);
seqList.add(0,4);
System.out.println(seqList.contains(2));
}
private static void testRemove() {
SeqList seqList=new SeqList();
seqList.add(0,1);
seqList.add(0,2);
seqList.add(0,3);
seqList.add(0,4);
seqList.remove(2);
seqList.display();
}
public static void main(String[] args) {
// containsTest();
testRemove();
}
}