github 地址:https://github.com/heng1234/data-structure
Array類
package com.company.Array;
/**
* Array
* 自定義數組
* @author heng
* @date 2019/9/24
**/
public class Array<E> {
/**
* 存儲的data
*/
private E[] data;
/**
* 描述data中有效的數量
*/
private int size;
/**
* 無參構造
*/
public Array(){
this(10);
}
/**
* 構造函數 傳入 capacaity構造Array的容量
* @param capacaity
*/
public Array(int capacaity){
data = (E[])new Object[capacaity];
size = 0;
}
/**
* 返回數組中容量大小
* @return
*/
public int getCapacaity() {
return data.length;
}
/**
* 返回容量size
* @return
*/
public int getSize() {
return size;
}
/**
* 數組是否爲空
* @return
*/
public boolean isEmpty(){
return size == 0;
}
/**
* 向最後一位添加數據
* @param e
*/
public void addLast(E e){
/*if (size == data.length){
throw new IllegalArgumentException("AddLast faied. Array is null");
}
data[size] = e;
size ++;*/
add(size,e);
}
/**
* 向第一一位添加數據
* @param e
*/
public void addFirst(E e){
add(0,e);
}
/**
* 在index插入一個新的元素e
* @param index
* @param e
*/
public void add(int index,E e){
if (index < 0 || index > size){
throw new IllegalArgumentException("Add faied. Array Require index>= 0 and index <= size");
}
if (size == data.length){
//這裏進行空間擴容 擴容2倍
this.resize(2 * data.length);
// throw new IllegalArgumentException("Add faied. Array is null");
}
for(int i = size-1; i >= index; i--) {
data[i+1] = data[i];
}
data[index] = e;
size ++;
}
/**
* 通過下標獲取元素
* @param index
* @return
*/
public E get(int index){
if(index <0 || index >= size){
throw new IllegalArgumentException("Get faied. Array is null");
}
return data[index];
}
/**
* 拿到最後一個元素
* @return
*/
public E getLast(){
return get(size - 1);
}
/**
* 拿到第一個元素
* @return
*/
public E getFirst(){
return get(0);
}
/**
* 根據下標更新
* @param index
* @return
*/
void set(int index,E e){
if(index <0 || index >= size){
throw new IllegalArgumentException("Get faied. Array is null");
}
data[index] = e;
}
/**
* 是否存在該值
* @param e
* @return
*/
public boolean contains(E e){
for (int i = 0; i < size; i++) {
if (data[i].equals(e) ){
return true;
}
}
return false;
}
/**
* 返回傳入的值的索引如果沒有返回-1
* 不考慮多個值索引
* @param e
* @return
*/
public int find(E e){
for (int i = 0; i < size; i++) {
if (data[i].equals(e)){
return i;
}
}
return -1;
}
/**
* 返回傳入的值的在數組中存在多少個 沒有返回0
* 不考慮多個值索引
* @param e
* @return
*/
public int findCout(E e){
int count = 0;
for (int i = 0; i < size; i++) {
if (data[i].equals(e)){
count ++;
}
}
return count;
}
/**
* 根據下標刪除
*/
/**
* 根據index索引刪除 並返回刪除的索引值
* @param index
* @param
*/
public E remove(int index){
if (index < 0 || index > size){
throw new IllegalArgumentException("Remove faied. Array Require index>= 0 and index <= size");
}
E ret = data[index];
for(int i = index+1; i < size; i++) {
data[i-1] = data[i];
System.out.println(i);
}
size --;//注意size --後還存在一個值只不過用戶訪問不到這個值
data[size] = null;//讓jvm回收機制回收 不是必填的 loitering objects != memory leak
/**
* 進行空間減少 lazy 減少 防止複雜度震盪 size = 4/1的時候減少空間
*/
if (size == data.length / 4 && data.length / 2 != 0){
resize(data.length / 2);
}
return ret;
}
/**
* 刪除數組中第一個元素
* @param
* @return
*/
public E removeFirst(){
return remove(0);
}
/**
* 刪除最後一個下標
* @param
* @return
*/
public E removeLast(){
return remove(size-1);
}
/**
* 如果存在該值則刪除 刪除單個
* @param e
*/
public void romoveElement(E e){
int index = find(e);
if (index != -1){
remove(index);
}
}
/**
* 如果存在該值則刪除 刪除數組中全部e值
* @param e
*/
public void romoveElementAll(E e){
System.err.println(data.length);
E newData[] =(E[])new Object[data.length];
int index = 0;
for(int i = 0; i < size; i++) {
if (!data[i].equals(e)){
newData[index] = data[i];
index ++;
}
}
size = index;
data = newData;
/**
* 進行空間減少 lazy 減少 防止複雜度震盪 size < 4/1的時候減少空間
*/
if (size < data.length / 4 && data.length / 2 != 0){
resize(data.length / 2);
}
}
/**
* toString 方法
*/
@Override
public String toString(){
StringBuilder builder = new StringBuilder();
builder.append(String.format("Array: size = %d , capacaity = %d\n",size,data.length));
builder.append("[ ");
for (int i = 0; i < size; i++) {
builder.append(data[i]);
if (i != size-1){
builder.append(" , ");
}
}
builder.append(" ]");
return builder.toString();
}
/**
* 擴容空間
* @param //擴容的數量
*/
private void resize(int newCapacaity){
E newData[] =(E[])new Object[newCapacaity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
}
測試類
package com.company;
/**
* 聲明數組
*/
public class Main {
public static void main(String[] args) {
Array<Integer> array = new Array<>();
array.addLast(11);
array.addLast(2);
array.addLast(3);
array.addLast(4);
array.addLast(1);
array.addLast(1);
array.addLast(1);
array.addLast(1);
array.addLast(9);
System.out.println(array);
array.add(6,99);
array.addFirst(0);
System.out.println(array);
array.romoveElementAll(1);
System.out.println(array);
}
}