package com.demo;
public class TArray<T> {
private T[] data;
private int size; //data数组中 实际元素个数
@SuppressWarnings("unchecked")
public TArray(int capacity) {
data = (T[]) new Object [capacity];
size = 0;
}
public TArray() {
this(10);
}
// 获取数组容量
public int getCapacity() {
return data.length;
}
// 获取数组中元素个数
public int getSize() {
return size;
}
// 判断数组是否为空
public boolean isEmpty() {
return size == 0;
}
// 在数组末尾追加元素
public void addLast(T e) {
add(size, e);
}
// 在数组开头添加元素
public void addFirst(T e) {
add(0, e);
}
// 在数组中间插入元素
public void add(int index, T e) {
if (index < 0 || index > size)
throw new IllegalArgumentException("add fail, need 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++;
}
@SuppressWarnings("unchecked")
private void resize(int length) {
T [] newData = (T[]) new Object [length];
for(int i = 0 ; i < size ; i++){
newData[i] = data[i];
}
data = newData;
}
// 根据引脚获取值
public T get(int index) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("get fail , index < 0 or index >= size");
return data[index];
}
// 根据引脚设置值
public void set(int index, T e) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("get fail , index < 0 or index >= size");
data[index] = e;
}
// 是否包含某个元素
public boolean contains(T e) {
for (int i = 0; i < size; i++) {
if(e.equals(data[i])){
return true;
}
}
return false;
}
//查找某个元素对应的位置
public int find(T e){
for(int i = 0 ; i < size ; i++){
if(e.equals(data[i])){
return i;
}
}
return -1;
}
//删除index对应的元素 返回删除的元素
public T remove(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("reomve fail , illegal args");
}
T ret = data[index];
for(int i = index+1 ; i < size ; i++){
data[i-1] = data[i];
}
size--;
//删减容量
if(size == data.length/2){
resize(size);
}
return ret;
}
//删除第一个元素
public T removeFirst(){
return remove(0);
}
//删除最后一个元素
public T removeLast(){
return remove(size-1);
}
//根据元素删除数组中对应的元素 并返回删除的值
public boolean removeElement(T e){
boolean flag = true;
int index = find(e);
try {
remove(index);
} catch (Exception e2) {
flag = false;
}
return flag;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("Array: size = %d , capacity = %d \n", size, data.length));
sb.append('[');
for (int i = 0; i < size; i++) {
sb.append(data[i]);
if (i != size - 1) {
sb.append(',');
}
}
sb.append(']');
return sb.toString();
}
}
测试代码
package com.demo;
public class Demo {
public static void main(String[] args) {
TArray<Integer> tArray = new TArray<>(10);
for(int i = 0 ; i < tArray.getCapacity() ; i++){
tArray.add(i, i);
}
System.out.println(tArray);
tArray.add(2, 345);
System.out.println(tArray);
tArray.remove(3);
System.out.println(tArray);
}
}
Array: size = 10 , capacity = 10
[0,1,2,3,4,5,6,7,8,9]
Array: size = 11 , capacity = 20
[0,1,345,2,3,4,5,6,7,8,9]
Array: size = 10 , capacity = 10
[0,1,345,3,4,5,6,7,8,9]