Java中的数据结构(一):PCollection接口定义、PArrayList的实现

来源:互联网 发布:网络大电影名词解释 编辑:程序博客网 时间:2024/04/24 09:47

为了系统的完成后面的数据结构学习,这里首先参考JDK源码定义了Collection等接口,并在抽象类种提供一些骨架方法,方便后面具体实现类的编写,当然这些灵感都是来自JDK源码,先学习搬运然后再学习创造。

1.顶层接口的定义

1.1 PCollection

public interface PCollection<E> extends PIterable<E> {   public abstract int size();   public abstract boolean isEmpty();   public abstract boolean contains(Object o);   public abstract PIterator<E> iterator();   public abstract Object[] toArray();   public abstract <T> T[] toArray(T[] arrayOfT);   public abstract boolean add(E e);   public abstract boolean remove(Object o);   public abstract boolean containsAll(PCollection<?> collection);   public abstract boolean addAll(PCollection<? extends E> collection);   public abstract boolean removeAll(PCollection<?> collection);   public abstract boolean retainAll(PCollection<?> collection);   public abstract void clear();   public abstract boolean equals(Object o);   public abstract int hashCode();}

1.2PAbstractCollection抽象类种提供一些骨架方法

public abstract class PAbstractCollection<E> implements PCollection<E> {   private static final int MAX_ARRAY_SIZE = 2147483639;   public abstract PIterator<E> iterator();   public abstract int size();   public boolean isEmpty() {      return (size() == 0);   }   public boolean contains(Object paramObject) {        return false;   }   public Object[] toArray() {      return null;   }   public <T> T[] toArray(T[] arrayOfT) {      return null;   }   public boolean add(E e) {      return false;   }   public boolean remove(Object o) {      return false;   }   public boolean containsAll(PCollection<?> paramCollection) {      return false;   }   public boolean addAll(PCollection<? extends E> paramCollection) {      return false;   }   public boolean removeAll(PCollection<?> paramCollection) {          return false;   }   public boolean retainAll(PCollection<?> paramCollection) {      return false;   }   public void clear() {  }}

2. PArrayList 的实现

2.1定义好了最顶层的Collection接口,我们第一篇就来实现一个比较简单的PArrayList

同样的本着面向接口编程的原则,我们首先定义PList接口,从而规定PList的实现类提供的基础功能。

public interface PList<E> extends PCollection<E>  {   //collection 公有方法   public abstract int size();   public abstract boolean isEmpty();   public abstract boolean contains(Object O);   public abstract PIterator<E> iterator();   public abstract Object[] toArray();   public abstract <T> T[] toArray(T[] arrayOfT);   public abstract boolean add(E paramE);   public abstract boolean remove(Object o);   public abstract boolean containsAll(PCollection<?> collection);   public abstract boolean addAll(PCollection<? extends E> collection);   public abstract boolean addAll(int paramInt, PCollection<? extends E> collection);   public abstract boolean removeAll(PCollection<?> collection);   public abstract boolean retainAll(PCollection<?> collection);   public abstract void clear();   public abstract boolean equals(Object o);   public abstract int hashCode();       //list 特有方法   public abstract E get(int index);   public abstract E set(int index, E e);   public abstract void add(int index, E e);   public abstract E remove(int index);   public abstract int indexOf(Object o);   public abstract int lastIndexOf(Object o);   public abstract PListIterator<E> listIterator();   public abstract PListIterator<E> listIterator(int paramInt);   public abstract PList<E> subList(int from, int to);}

2.2 PAbstractList提供骨架方法实现

public abstract class PAbstractList <E> extends PAbstractCollection<E> implements PList<E> {   protected transient int modCount = 0;   @Override   public boolean containsAll(PCollection<?> collection) {          return false;   }   @Override   public boolean addAll(PCollection<? extends E> collection) {      return false;   }   @Override   public boolean addAll(int index, PCollection<? extends E> collection) {          return false;   }   @Override   public boolean removeAll(PCollection<?> collection) {      return false;   }   @Override   public boolean retainAll(PCollection<?>collection) {      return false;   }   @Override   public E get(int index) {      return null;   }   @Override   public E set(int index, E e) {      return null;   }   @Override   public void add(int index, E e) {  }   @Override   public E remove(int paramInt) {      return null;   }   @Override   public int indexOf(Object paramObject) {      return 0;   }   @Override   public int lastIndexOf(Object paramObject) {      return 0;   }   @Override   public PListIterator<E> listIterator() {         return null;   }   @Override   public PListIterator<E> listIterator(int paramInt) {         return null;   }   @Override   public PList<E> subList(int paramInt1, int paramInt2) {      return null;   }   @Override   public PIterator<E> iterator() {      return null;   }   @Override   public int size() {      return 0;   }}

2.3 PArrList

public class PArrayList<T> extends PAbstractList<T> implements PList<T>{   private static final int Inital_Size =10;     private  int size;   private  int eleCount;   private  float growFactor =0.5F;   private  Object[] array;   public PArrayList() {      this.array = new Object[Inital_Size];      this.size = this.array.length;   }   public PArrayList( int size) {                this.size = size;      this.array = new Object[size];   }   public PArrayList( int size, float growFactor) {                  this.size = size;      this.growFactor = growFactor;      this.array = new Object[size];   }   @Override   public boolean add(Object t) {//添加一个元素      if(capacityIsEnough()){         eleCount+=1;         this.array[eleCount-1]= t;         return true;      }else{         growUp();         add(t);      }      return false;   }   @Override   public boolean remove(Object t) { // 移除一个元素      if (eleCount <= 0 || size <= 0 ) {         return false;      }      int index = indexOf(t);      if (index<0) {//不存在         return false;      }else{                removeByIndex(index);         eleCount-=1;         return true;      }   }   @Override   public int size() {      return eleCount;   }        @Override   public T get(int index) { //根据坐标获取      T t = (T) this.array[index];      return t;   }   @Override   public T remove(int index) {  //对外暴露的根据坐标移除      T t = get( index);      removeByIndex(index);      eleCount--;      return t;   }   private boolean capacityIsEnough(){ //是否需要扩容      if (eleCount<this.array.length) {         return true;      }      return false;   }   private void growUp(){ //扩容执行函数      int newSize= Math.round(this.size*(1+growFactor));      Object[] newArrya = new Object[newSize];      int i=0;      for (Object object : this.array) {         newArrya[i++] = object;      }   }   public int indexOf(Object t){ // 获取对象的坐标      int index = -1;      if (t==null) {         int i = 0;         for (Object object : array) {            i++;            if (object == null) {               if (i <0 || i >eleCount)                   return -1;                return i;            }         }      }else{         int i = 0;         for (Object object : array) {                       if (t.equals(object)) {               if (i <0 || i >eleCount)                   return -1;               return i;            }            i++;         }      }      return index ;   }   int removeByIndex(int index){ //根据坐标移除      if (index == eleCount-1) {//最后一个元素         array[index]=null;      }      System.arraycopy(array, index+1, array,index , eleCount-index);//-1      return 1;   }}

2.4 测试评估

public class TestPArrayList {   public static void main(String[] args) {         PList<User> list = new PArrayList<User>();      User user1 = new User(1);      list.add(user1);      list.add(new User(2));      list.add(new User(3));      list.add(new User(4));      list.add(new User(5));      list.add(new User(6));      User user7 = new User(7);      list.add(user7);      System.out.println("removed user:: "+list.remove(0));      list.remove(user7);            for (int i =0;i<list.size() ; i++) {         System.out.println(list.get(i).toString());      }      System.out.println("size: "+list.size());   }}

测试结果

removed user:: User [id=1, name=null, age=0, money=0.0, gender=0]User [id=2, name=null, age=0, money=0.0, gender=0]User [id=3, name=null, age=0, money=0.0, gender=0]User [id=4, name=null, age=0, money=0.0, gender=0]User [id=5, name=null, age=0, money=0.0, gender=0]User [id=6, name=null, age=0, money=0.0, gender=0]size: 5
0 0
原创粉丝点击