Java-顺序表的接口实现!

以下是实现一个动态顺序表需要支持的接口:

  1. 打印顺序表
  2. 在pos位置新增元素
  3. 判定是否包含某个元素
  4. 查找某个元素对应的位置
  5. 获取pos的位置
  6. 给pos位置的元素设为value
  7. 删除第一次出现的关键字key
  8. 获取顺序表长度
  9. 清空顺序
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();
 }
}

猜你喜欢

转载自blog.csdn.net/weixin_44378053/article/details/104453393
今日推荐