import java.io.Serializable;
/**
* @Author: guochengsen
* @Description: 动态数组实现&复杂度分析
* @Date: Created in 2018/6/3 17:59
*/
public class GArray<E> implements Serializable {
private static final long serialVersionUID = 543432814631497476L;
/**
* 内部维护的数组
*/
private E[] data;
/**
* 数据大小
*/
private int size;
/**
* 提供对外初始化大小构造
* @param capacity
*/
public GArray(int capacity) {
this.size = size;
this.data = (E[]) new Object[capacity];
}
/**
* 默认大小10
*/
public GArray() {
this(10);
}
/**
* 获取数组大小
* @return
*/
public int getSize() {
return this.size;
}
public int getCapaCity() {
return data.length;
}
/**
* 判断数组是否为空
* @return
*/
public boolean isEmpty() {
return this.size == 0;
}
/**
* 添加到最后: O(1) 均摊复杂度O(2) -> O(1)
* @param e
* @return
*/
public boolean addLast(E e) {
return add(this.size, e);
}
/**
* 添加到首位: O(n)
* @param e
* @return
*/
public boolean addFirst(E e) {
return add(0, e);
}
/**
* 指定位置插入元素: O(n)
* @param index
* @param e
* @return
*/
public boolean add(int index, E e) {
if (index < 0 && index > this.size) {
throw new IllegalArgumentException("Add failed. required index > 0 && index < size");
}
if (index == data.length) {
resize((int)(data.length * 1.5f));
}
for (int i = size - 1; i >= index; i--) {
data[i + 1] =data[i];
}
data[index] = e;
size++;
return true;
}
/**
* 移除第一个元素: O(n)
* @return
*/
public E removeFirst() {
return remove(0);
}
/**
* 移除最后一个元素: O(1) 均摊复杂度 O(2) -> O(1)
*/
public E removeLast() {
return remove(size - 1);
}
/**
* 按索引移除某个元素:
* @param index
* @return
*/
public E remove(int index) {
if (index < 0 && index > size) {
throw new IllegalArgumentException("remove failed. required index > 0 && index < size");
}
E ret = data[index];
for (int i = index + 1; i < size; i++) {
data[i] = data[i + 1];
}
size --;
if (data.length >= size / 4 && data.length / 2 != 0) {
resize(data.length / 2);
}
return ret;
}
/**
* 移除某个元素: O(n)
* @param e
* @return
*/
public boolean removeElement(E e) {
int index = find(e);
if (index != -1) {
remove(index);
return true;
}
return false;
}
/**
* 移除所有元素: O(n^2)
* @param arrs
*/
public void removeAll(GArray<E> arrs) {
if (arrs == null) {
return;
}
for (int i = 0; i < arrs.size; i++) {
if (contains(arrs.get(i))) {
arrs.remove(i);
}
}
}
/**
* 修改元素: O(1)
* @param index
* @param e
* @return
*/
public boolean set(int index, E e) {
if (index < 0 && index > size) {
throw new IllegalArgumentException("Set failed. required index > 0 && index < size");
}
data[index] = e;
return true;
}
/**
* 依据索引查找元素: O(1)
* @param index
* @return
*/
public E get(int index) {
if (index < 0 && index > size) {
throw new IllegalArgumentException("Find failed. required index > 0 && index < size");
}
return data[index];
}
/**
* 查找元素下标: O(n)
* @param e
* @return
*/
public int find(E e) {
for (int i = 0; i < data.length; i++) {
if (e == null) {
if (data[i] == null)
return i;
} else {
if (e.equals(data[i])) {
return i;
}
}
}
return -1;
}
/**
* 元素是否包含: O(n)
* @param e
* @return
*/
public boolean contains(E e) {
for (int i = 0; i < size; i++) {
if (e == null) {
if (data[i] == null) {
return true;
}
} else {
if (e.equals(data[i])) {
return true;
}
}
}
return false;
}
/**
* 扩容: 复杂度O(n)
* @param capacity
*/
private void resize(int capacity) {
E[] newData = (E[]) new Object[capacity];
for (int i = 0; i < data.length; i++) {
newData[i] = data[i];
}
data = newData;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));
res.append('[');
for (int i = 0; i < size; i++) {
res.append(data[i]);
if (i != size - 1) {
res.append(',');
}
}
res.append(']');
return res.toString();
}
}