实现一个动态数组
2019-07-06 本文已影响4人
谁家的猪
动态数组是指在声明时没有确定数组大小的数组
代码如下
/**
* @author lijiayin
* 动态数组
*/
public class Array<T> {
private T[] data;
private int size;
/**
* 构造函数,传入数组容量capacity构造Array
* @param capacity
*/
@SuppressWarnings("all")
public Array(int capacity) {
data = (T[])new Object[capacity];
size = 0;
}
/**
* 无参构造,默认容量10
*/
public Array() {
this(10);
}
/**
* 获取数组元素个数
* @return
*/
public int getSize(){
return size;
}
/**
* 获取数组容量
* @return
*/
public int getCapacity(){
return data.length;
}
/**
* 判断数组是否为空
* @return
*/
public boolean isEmpty(){
return size == 0;
}
/**
* 在数组第一位添加元素
* @param e
*/
public void addFirst(T e){
add(0, e);
}
/**
* 在数组最后一位添元素
* @param e
*/
public void addLast(T e){
add(size, e);
}
/**
* 向第index位置添加元素
* @param index
* @param e
*/
public void add(int index, T e){
if(index < 0 || index > size){
throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size");
}
//扩容为两倍
if(size == data.length){
resize(2 * data.length);
}
//元素向后移动
for (int i = size - 1; i > index; i--) {
data[i + 1] = data[i];
}
data[index] = e;
size++;
}
@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();
}
/**
* 获取index位元素
* @param index
* @return
*/
public T get(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Get failed. Index is illegal.");
}
return data[index];
}
/**
* 获取数组第一个元素
* @return
*/
public T getFirst(){
return get(0);
}
/**
* 获取数组最后一个元素
* @return
*/
public T getLast(){
return get(size - 1);
}
/**
* 替换index位置的元素
* @param index
* @param e
*/
public void set(int index, T e){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Set failed. Index is illegal.");
}
data[index] = e;
}
/**
* 数组是否包含某个元素
* @param e
* @return
*/
public boolean contains(T e){
for (int i = 0; i < size; i++) {
if(data[i].equals(e)){
return true;
}
}
return false;
}
/**
* 查找元素出现的第一个位置
* @param e
* @return
*/
public int find(T e){
for (int i = 0; i < size; i++) {
if(data[i].equals(e)){
return i;
}
}
return -1;
}
/**
* 删除index位置元素
* @param index
* @return
*/
public T remove(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Remove failed. Index is illegal.");
}
T ret = data[index];
for (int i = index; i < size - 1; i++) {
data[i] = data[i + 1];
}
size--;
data[size] = null;
//当数组中元素个数小于容量的1/4时,容量减小为1/2
if(size == data.length / 4 && data.length / 2 != 0){
resize(data.length / 2);
}
return ret;
}
/**
* 删除数组第一个元素
* @return
*/
public T removeFirst(){
return remove(0);
}
/**
* 删除数组最后一个元素
* @return
*/
public T removeLast(){
return remove(size - 1);
}
/**
* 查找元素出现的第一个位置并删除
* @param e
*/
public void removeElement(T e){
int index = find(e);
if(index != -1){
remove(index);
}
}
/**
* 对数组扩容
* @param newCapacity
*/
@SuppressWarnings("all")
private void resize(int newCapacity) {
T[] newData = (T[])new Object[newCapacity];
for (int i = 0; i < data.length; i++) {
newData[i] = data[i];
}
data = newData;
}
}