package sequenceList;
import java.util.Iterator;
/**
* @Author zhw
* Version 1.0
* @Description SequenceList
* Date 2021/8/12 13:37
**/
public class SequenceList<T> implements Iterable<T> {
/**
* @Description: 存储元素的数组
*/
private T[] elements;
/**
* @Description:记录当前顺序表中的元素的个数
*/
private int N;
public SequenceList() {
//初始化数组
this.elements = (T[]) new Object[10];
//初始化长度
this.N = 0;
}
public SequenceList(int capacity) {
//初始化数组
this.elements = (T[]) new Object[capacity];
//初始化长度
this.N = 0;
}
/**
* @Description:清空顺序表
* @return: void
*/
public void clear() {
//this.elements= (T[]) new Object[elements.length];
this.N = 0;
}
/**
* @Description: 判断线性表是否为空
* @return: boolean
*/
public boolean isEmpty() {
return N == 0;
}
/**
* @Description: 获取线性表的长度
* @return: int
*/
public int length() {
return N;
}
/**
* @param i i
* @Description: 获取指定位置的元素
* @return: T
*/
public T get(int i) {
return elements[i];
}
/**
* @param t t
* @Description: 向线性表中添加元素t
* @return: void
*/
public void insert(T t) {
if (N == elements.length) {
resize(2 * elements.length);
}
elements[N++] = t;
}
/**
* @param i i
* @param t t
* @Description: 在i位置插入一个元素
* @return: void
*/
public void insert(int i, T t) {
if (N == elements.length) {
resize(2 * elements.length);
}
for (int j = N; j > i; j--) {
elements[j] = elements[j - 1];
}
elements[i] = t;
N++;
}
/**
* @param i i
* @Description: 删除并返回线性表中第i个数据元素
* @return: T
*/
public T remove(int i) {
T t = elements[i];
for (int j = i; j < N; j++) {
elements[j] = elements[j + 1];
}
N--;
if (N < elements.length / 4) {
resize(elements.length / 2);
}
return t;
}
/**
* @param i i
* @param t t
* @Description: 修改索引i位置的元素
* @return: void
*/
public void replace(int i, T t) {
elements[i] = t;
}
/**
* @param t t
* @Description: 返回指定元素的索引
* @return: int
*/
public int indexOf(T t) {
for (int i = 0; i < elements.length; i++) {
if (t.equals(elements[i])) {
return i;
}
}
return -1;
}
/**
* @param newSize newSize
* @Description: 根据参数newSize, 重置selements的大小
* @return: void
*/
private void resize(int newSize) {
//定义一个临时数组,指向原数组
T[] temp = elements;
//创建新数组
elements = (T[]) new Object[newSize];
//把原数组的数据拷贝到新数组即可
for (int i = 0; i < N; i++) {
elements[i] = temp[i];
}
}
@Override
public Iterator<T> iterator() {
return new SIterator();
}
private class SIterator implements Iterator {
private int cusor;
public SIterator() {
this.cusor = 0;
}
@Override
public boolean hasNext() {
return cusor < N;
}
@Override
public Object next() {
return elements[cusor++];
}
}
}