用迭代子模式,泛型 寫一個能夠自動擴容的集合類

首先是集合類的接口:java

public interface ICollection<E> {
	public int size();//集合大小
	public boolean add(E e);//集合中的添加方法
	public IIterator<E> iterator();//迭代器
	public Object get(int index);//經過下標得到元素
}

集合接口的實現:數組

public class MyCollection<E> implements ICollection<E>{

	private  Object array[];//集合中存放內容的數組,必須爲 private ,由於不可以被外部訪問到
	private int position=-1;//用來判斷集合中放了多少個元素了, array.length 返回的是容器的大小,沒法獲得已經存放了多少元素
	private int max;//集合的最大容量
	
	public MyCollection(){//無參構造方法,集合大小爲10
		this(10);
	}
	
	public MyCollection(int capacity){//有參構造方法
		if(capacity<=0){
			throw new IllegalArgumentException("Illegal param : "+capacity);
		}
		array=new Object[capacity];
		this.max=capacity;
	}
	
	
	@Override
	public int size() {
		return (position+1);
	}

	@Override
	public boolean add(E e) {
		if((position+1)>=max){//若是集合中存放的元素個數>=最大容量 ,此時還要放入元素,就必須進行擴容了
			max=max/2*3+1;//這個擴容大小是模仿的 ArrayList
			enlarge();//擴容
		}
		array[++position]=e;
		return true;
	}
	
	private  void enlarge(){
		//將 array數組的內容拷貝到 array 中 ,並將容量擴充到 max ----Arrays.copyOf 這個方法的底層實現仍是 使用的 System.arraycopy 這個方法
		array=Arrays.copyOf(array, max);
	}

	@Override
	public IIterator<E> iterator() {//能夠用迭代器去對集合進行操做,例如:遍歷
		return new MyIterator<E>(this);
	}

	@Override
	public Object get(int index) {
		return array[index];
	}
	
	

}

 

迭代器接口:ide

public interface IIterator<E> {
	public boolean hasNext();//判斷是否還有下一個
	public Object next();//獲得集合下一個元素
}

迭代器接口的實現:測試

public class MyIterator<E> implements IIterator<E>{

	public ICollection<E> collection;
	private int top=-1;//下標
	
	public MyIterator(ICollection<E> collection){//經過集合那裏的 iterator() 方法將集合 傳進來.
		this.collection=collection;
	}
	
	@Override
	public boolean hasNext() {
		if(top<collection.size()-1){
			return true;
		}else{
			return false;
		}
	}

	@Override
	public Object next() {
		return collection.get(++top);
	}

}

如今進行測試:this

public class Test {
	public static void main(String[] args) {
		ICollection<String> c=new MyCollection<String>(2);
		c.add("xiaofeiji");
		c.add("xiaoxiao");
		c.add("xiaobaicai");
		c.add("1");
		IIterator<String> iterator=c.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}
}

結果在控制檯按順序輸出.code

原先容量只有2,如今它自動擴容了接口

相關文章
相關標籤/搜索