码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构--ArrayList的Java实现

时间:2015-03-08 17:20:20      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:数据结构arraylist的java实现

上代码:

package com.itany.MyArrayList;

import java.util.Iterator;

public class MyArrayList<T> implements Iterable<T>
{
    private static final int DEFAULT_CAPACITY=10;//默认数组容量大小
    private int theSize;//集合中元素的个数大小
    private T[] theItems;//集合中的数组
    public MyArrayList()
    {
        theSize=0;
        clear();
    }
    public int size()
    {
        return theSize;
    }
    //清除所有集合中的所有元素
    public void clear()
    {
        theSize=0;
        ensureCapacity(DEFAULT_CAPACITY);
    }
    public boolean isEmpty()
    {
        return size()==0;
    }
    //缩小数组大小 缩小到和集合中元素个数一样大
    public void trimToSize()
    {
        ensureCapacity(size());
    }
    public T get(int idx)
    {
        //注意这里idx>最好写size()因为 get方法返回的是T 如果写theItems.length可能返回的是一个空 而不是对应的T
        if(idx<0 || idx>=size())
            throw new ArrayIndexOutOfBoundsException();
        return theItems[idx];
    }
    //返回被修改的原始值
    public T set(int idx,T newT)
    {
        if(idx<0 || idx>size())
            throw new ArrayIndexOutOfBoundsException();
        T old=theItems[idx];
        theItems[idx]=newT;
        return old;
    }
    //根据新的容量大小来扩充theItems数组的大小 并且把旧的数组内容传进新theItems的里面
    public void ensureCapacity(int newCapacity)
    {
        //如果新容量大小<集合中元素的个数 则直接结束方法
        if(newCapacity<theSize)
            return;
        T[] old=theItems;
        //theItems=new T[newCapacity]; Cannot create a generic array of T不能直接new泛型数组
        theItems=(T[])new Object[newCapacity];//只能这样写 这样的警告不可避免
        //把所有旧的数组里面内容全部给到新的容量数组里面  注意在clear调用时 由于theSize=0 不会赋值
        for(int i=0;i<size();i++)
        {
            theItems[i]=old[i];//剩余的为空
        }
    }
    //直接默认加在最后一个
    public void add(T newT)
    {
        add(size(),newT);
    }
    public void add(int idx,T newT)
    {
        //在插入时,需要考虑集合的元素个数是否已经等于数组的容量大小 负责需要对数组容量进行扩容
        if(size()==theItems.length)
            ensureCapacity(2*size()+1);
        //此时数组容量是大于集合元素个数
        //对于插入有两种可能 1如果插入位置>=size()大小的位置 那么不需要移动  2另一种 如果插入位置<size() 则需要平移
        //但是两者都需要相同的语句theItems[idx]=newT
        for(int i=size();i>idx;i--)//size()>idx的情况 不满足的话 不执行跳过即可
        {
            theItems[i]=theItems[i-1];
        }
        theItems[idx]=newT;//所有情况都要
        theSize++;
    }
    public T remove(int idx)
    {
        T oldT=theItems[idx];
        for(int i=idx;i<size()-1;i++)
        {
            theItems[i]=theItems[i+1];
        }
        theSize--;
        return oldT;
    }
    
    @Override
    //重写iterator方法 以获得一个自己写的ArrayListIterator迭代器
    public Iterator<T> iterator()
    {
        // TODO Auto-generated method stub
        return new ArrayListIterator();
    }
    //自己写的迭代器类ArrayListIterator
    private class ArrayListIterator implements Iterator<T>
    {
        private int current=0;
        @Override
        public boolean hasNext()
        {
            return current<size();
        }
        @Override
        public T next()
        {
            if(!hasNext())
                throw new java.util.NoSuchElementException();
            return theItems[current++];//current是先调用后+1
        }
        @Override
        public void remove()
        {
            //调用完next之后 current已经+1 因此要先-1 再删除当前
            //不能只写this.remove(--current); 因为这个this是ArrayListIterator对象
            MyArrayList.this.remove(--current);
        }
    }
}

package com.itany.MyArrayList;

import java.util.Iterator;

public class Test
{
    
    public static void main(String[] args)
    {
        MyArrayList<Integer> my=new MyArrayList<Integer>();
        my.add(12);
        my.add(11);
        my.add(13);
        my.add(2,14);
        my.remove(1);
        Iterator<Integer> it=my.iterator();
        while(it.hasNext())
        {
            System.out.print(it.next()+"  ");
        }
    }
    
}


数据结构--ArrayList的Java实现

标签:数据结构arraylist的java实现

原文地址:http://blog.csdn.net/u012411414/article/details/44133261

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!