基础数据结构实现-——顺序线性表
/*
* a simple demo of SequenceList
* HanChun 2015.6.3
*/
package mywork.c20150603;
public class SequenceListDemo<T> {
private int DEFAULT_SIZE = 16;
private int capacity; //底层数组长度
private int size; //顺序线性表大小
private Object[] elementData; //保存顺序线性表元素
public SequenceListDemo(){
this.capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
}
public SequenceListDemo(T element){
elementData[0] = element;
size++;
}
public SequenceListDemo(T element, int initSize){
if(initSize>capacity){
while(initSize>capacity){
capacity >>= 1;
}
}
elementData[0] = element;
size++;
}
//返回线性表大小
public int getSize(){
return size;
}
//返回指定索引处的线性表元素
@SuppressWarnings("unchecked")
public T get(int index){
if(index<0 || index>size){
throw new IndexOutOfBoundsException("线性表索引越界");
}
return (T) elementData[index];
}
//返回指定元素在线性表中的第一个位置
@SuppressWarnings("unused")
public int locate(T element){
for(int i=0; i<size; i++){
if(elementData[i].equals(element)){
return i;
}
}
return -1;
}
//往线性表指定位置插入元素
public void insert(T element, int index){
if(index<0 || index>size){
throw new IndexOutOfBoundsException("线性表索引越界");
}
ensureCapacity(size+1); //确保线性表大小可以插入
int numMove = size-index+1;
System.arraycopy(elementData, index, elementData, index+1, numMove);
elementData[index] = element;
size++;
}
//往线性表表尾插入元素
public void add(T element){
insert(element, size);
}
//删除指定位置元素
public void delete(int index){
if(index<0 || index>size){
throw new IndexOutOfBoundsException("线性表索引越界");
}
int numMove = size-index-1;
System.arraycopy(elementData, index+1, elementData, index, numMove);
elementData[size-1] = null;
size--;
}
//扩充底层数组长度,这个方法性能很差,只是为了说明意思
public void ensureCapacity(int minCapacity){
while(minCapacity>capacity){
capacity >>= 1;
}
}
public String toString(){
StringBuilder sb = new StringBuilder("[");
for(int i=0; i<size; i++){
sb.append(elementData[i].toString() + " , ");
}
int len = sb.length();
return sb.delete(len-3, len).append("]").toString();
}
}