您的位置:首页 > 其它

顺序链表-MyArrayList的实现

2016-06-30 11:29 344 查看
package lpc.Algorithm;

import java.util.Iterator;

import java.util.NoSuchElementException;

public class MyArrayList<T> implements Iterable<T>{

 

 //设置数组初始大小

 public static final int DEFAULT_CAPACITY = 10;

 

 //记录数据已的存储数量

 private int theSize;

 //数组

 private T[] theItems;

 

 //构造函数,初始数组,数组长度为  DEFAULT_CAPACITY

 public MyArrayList() {

  // TODO Auto-generated constructor stub

  //创建泛型数组的方法来创建初始数组

  theItems=(T[])new Object[DEFAULT_CAPACITY];

  //现有0条数据

  theSize=0;

 }

 

 //获取已存储的数据量

 public int size(){

  return theSize;

 }

 //判断是否存在数据

 public boolean isEmpty(){

  return size()==0;

 }

 

 //改变数组长度,(可做扩容时使用)

 public void ensureCapacity(int newCapacity){

  //判断要创建的容量是否能存储的下数据,存不下就返回

  if (newCapacity < size()) {

   return;

  }

  //把眼熟组存入临时变量

  T[] old=theItems;

  

  //创建一个指定容量的新数组(泛型数组)

  theItems = (T[])new Object[newCapacity];

  

  //把原有数据转存到新数组

  for (int i = 0; i < size(); i++) {

   theItems[i] = old[i];

  }

 }

 

 

 

 //把数组长度变为数据个数避免浪费空间

 public void trimToSize(){

  ensureCapacity(size());

 }

 

 //根据索引数,得到数据

 public T get(int index){

  

  //判断是否超出边界

  if(index < 0 || index >= size()){

   throw new ArrayIndexOutOfBoundsException();

  }

  return theItems[index];

 }

 

 //修改制定索引上的数据,并返回被替换的数据

 public T set(int index, T newVal){

  //判断是否超出边界

  if(index < 0 || index >= size()){

   throw new ArrayIndexOutOfBoundsException();

  }

  

  T old= theItems[index];

  //成功替换

  theItems[index]=newVal;

  return old;

 }

 //在制定索引处增加数据

 public void add(int index,T x){

 

  //判断数组长度和数据个数是否相同,若相同,则数组已装满数据,再增加数组需要扩容

  if (theItems.length==size()) {

   //扩容为数据项数的两倍+1

   ensureCapacity(size()*2+1);

  }

  //把在制定索引处的数据后移一项

  for (int i = size(); i > index; i--) {

   theItems[i] = theItems[i-1];

  }

  //把数据插入倒指定位置

  theItems[index]=x;

  

  //把数据项数增加1

  theSize++;

 }

 

 //在末尾增加数据项

 public boolean add(T x){

  add( size() , x);

  return true;

 }

 

 //删除制定索引处的数据

 public T remove( int index){

  T removedItem = theItems[ index ];

  for (int i = index; i < size()-1; i++) {

   theItems[i] = theItems[i+1];

  }

  theSize --;

  return removedItem;

 };

 

 public Iterator<T> iterator() {

  // TODO Auto-generated method stub

  return new Iterator<T>() {

   

   private int current = 0;

   

   public boolean hasNext() {

    // TODO Auto-generated method stub

    return current < size();

   }

   public T next() {

    // TODO Auto-generated method stub

    if(!hasNext()){

     throw new NoSuchElementException();

    }

    //返回结果后,current再加1

    return theItems[current++];

   }

   public void remove() {

    // TODO Auto-generated method stub

    //System.out.println("迭代期间不提供删除功能");

    MyArrayList.this.remove(--current);

   }

   

  };

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: