数据结构: Java中ArrayList的简单实现
2015-10-06 00:35
459 查看
上学期的数据结构这门课学到了图。用C语言把书上介绍的内容都实现了一遍,但感觉学校教的都太基础了。
这个学期准备先重温一下,然后再深入一点学习算法和数据结构。
语言使用Java, 目前买了3本书《Algorithms (4th edition)》、《数据结构预算法 Java语言描述》、《算法分析与设计基础》
下面是我自己实现的简单版本的支持泛型的线性表。
ArrayList的优点: get和set方法的运行时间为O(1)
ArrayList的缺点: add和remove操作为花费的时间很多,除非是在表的末尾。
MyArrayList底层使用数组来实现,所以需要考虑数组下标和容量问题。如果容量不够的时候,需要自动增加容量。trimToSize()方法可以释放多余的容量,使之与线性表的长度相匹配。
ArrayListIterator为了跟MyArrayList更好地通信,所以作为MyArrayList的内部类。
这个学期准备先重温一下,然后再深入一点学习算法和数据结构。
语言使用Java, 目前买了3本书《Algorithms (4th edition)》、《数据结构预算法 Java语言描述》、《算法分析与设计基础》
下面是我自己实现的简单版本的支持泛型的线性表。
ArrayList的优点: get和set方法的运行时间为O(1)
ArrayList的缺点: add和remove操作为花费的时间很多,除非是在表的末尾。
MyArrayList底层使用数组来实现,所以需要考虑数组下标和容量问题。如果容量不够的时候,需要自动增加容量。trimToSize()方法可以释放多余的容量,使之与线性表的长度相匹配。
ArrayListIterator为了跟MyArrayList更好地通信,所以作为MyArrayList的内部类。
package list; import java.util.Iterator; public class MyArrayList<T> implements Iterable<T> { //默认容量和增量 private static final int DEFAULT_CAPACITY = 10; private static final int CAPACITY_INCREMENT = 5; //存放的元素数量 private int size = 0; //数组本身 private T[] items; /** * 默认初始化10容量的数组 */ public MyArrayList() { super(); init(); } /** * 初始化initSize容量的数组 * @param initSize */ public MyArrayList(int initSize) { super(); init(initSize); } @SuppressWarnings("unchecked") private void init(){ items = (T[]) new Object[DEFAULT_CAPACITY]; } @SuppressWarnings("unchecked") private void init(int initSize){ items = (T[]) new Object[initSize]; } public void clear(){ size = 0; init(); } @SuppressWarnings("unchecked") public void trimToSize(){ T[] newItems = (T[]) new Object[size]; for(int i=0; i<size; i++){ newItems[i] = items[i]; } items = newItems; } public boolean isEmpty(){ return size == 0; } public int size(){ return size; } /** * 在数组末尾添加一个T类型的item * @param item 插入的item值 * @return */ public void add(T item){ ensureCapacity(); items[size] = item; ++size; } /** * 在索引位置插入一个item * @param idx 索引位置 * @param item 插入的item的值 * @return */ public void add(int idx, T item){ if(idx < 0 || idx > size){ throw new ArrayIndexOutOfBoundsException(); } ensureCapacity(); for(int i=size;i>idx;i--){ items[i] = items[i-1]; } items[idx] = item; ++size; } /** * 获取索引位置的元素 * @param idx 索引位置 * @return */ public T get(int idx){ if(idx < 0 || idx >= size){ throw new ArrayIndexOutOfBoundsException(); } return (T) items[idx]; } /** * 将idx位置的元素设置成item * @param idx 索引位置 * @param item 新的item值 * @return 旧的idx位置的item值 */ public T set(int idx, T item){ if(idx < 0 || idx >= size){ throw new ArrayIndexOutOfBoundsException(); } T oldItem = items[idx]; items[idx] = item; return oldItem; } /** * 移除idx处的元素 * @param idx 元素的索引 * @return 返回被移除的item */ public T remove(int idx){ if(idx < 0 || idx >= size){ throw new ArrayIndexOutOfBoundsException(); } T oldItem = items[idx]; for(int i=idx;i<size-1;i++){ items[i] = items[i+1]; } size--; return oldItem; } /** * 数组容量不够时增加容量,确保不会越界。重要 */ @SuppressWarnings("unchecked") private void ensureCapacity(){ if(size==items.length){ T[] newItems = (T[]) new Object[size+CAPACITY_INCREMENT]; for(int i=0; i<size; i++){ newItems[i] = items[i]; } items = newItems; } } @Override public Iterator<T> iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator<T>{ private int position = 0; @Override public boolean hasNext() { return position < size(); } @Override public T next() { return (T) items[position++]; } public void remove(){ MyArrayList.this.remove(--position); } } }
相关文章推荐
- dlutoj 单调队列
- 数据结构实践——负数把正数赶出队列
- 数据结构实践——停车场模拟(栈和队列综合)
- 大话数据结构(2)--数据-横看成岭侧成峰
- iOS编程------XML、JSON数据结构解析
- [面试时]MySQL索引背后的数据结构及算法原理
- 数据结构实践——排队看病模拟(队列)
- POJ 2823 单调队列
- 【数据结构】线性结构:存储&运算&时间复杂度
- 数据结构之线性表
- Linux的常用数据结构之链表
- 数据结构【线性表(二)链表】项目之猴子选大王
- 第4周SHH数据结构—【项目3-单链表应用(1)】
- 数据结构【线性表(二)链表】项目之循环双链表应用
- 数据结构实践——多项式求和
- 第六周项目2—数据结构之自建算法库—链栈
- 项目2 -- 建立链栈算法库
- 数据结构【线性表(二)链表】项目之多项式求和
- 【栈项目1 - 建立顺序栈算法库 第六周】
- 数据结构实践——猴子选大王