上學期的數據結構這門課學到了圖。用C語言把書上介紹的內容都實現了一遍,但感覺學校教的都太基礎了。
這個學期準備先重溫一下,然後再深入一點學習算法和數據結構。
語言使用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);
}
}
}