数据结构之数组java

数据结构之数组

Array一些操作函数:

//自定义一个E型的泛型数组
public class Array<E> {

private E data[];
private int size;

/**
 * 构造函数
 * @param capacity 传入数组容量
 */
public Array(int capacity){
    data=(E[])new Object[capacity];//先new一个Object的数组,在强制转换成E型的数组
    size=0;
}

/**
 * 无参数的构造函数,默认数组容量为capacity 10
 */
public Array(){
    this(10);
}

/**
 * 获取数组中的元素个数
 * @return
 */
public int getSize(){
    return size;
}

/**
 * 获取数组容量
 * @return
 */
public int getCapacity(){
    return data.length;
}

/**
 * 向所有元素后添加一个元素e
 * @param e 添加的元素
 */
public void addLast(E e){
    add(size,e );
}

/**
 * 在所有元素最前面添加一个元素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("AddLast is failed,Required index>=0 && index<=size");
    }

    //扩容
    if(size == data.length)
         resize(2 * data.length);

    //依次从最后的位置开始往后移,直到index
    for (int i = size - 1; i >= index; i--) {
        data[i + 1] = data[i];
    }
    //添加到index位置
    data[index] = e;
    size++;
}

/**
 * 重写toStrong函数
 * @return
 */
@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
 */
E get(int index){
    //位置不在数组内,抛出异常
    if (index < 0 || index > size) {
        throw new IllegalArgumentException("AddLast is failed,Required index>=0 && index<=size");
    }
    return data[index];
}

/**
 * 修改索引位置的元素值
 * @param index
 * @param e
 */
void set(int index,E e){
    //位置不在数组内,抛出异常
    if (index < 0 || index > size) {
        throw new IllegalArgumentException("AddLast is failed,Required index>=0 && index<=size");
    }
    data[index]=e;
}

/**
 * 查找数组中是否有元素e
 * @param e
 * @return
 */
public boolean contains(E e){
    for(int i=0;i<size;i++){
        //两个类之间的值的比较用equals
        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;
}

/**
 * 从数组中删除index位置的元素
 * @param index
 * @return
 */
public E remove(int index) {
    //数组已空,抛出异常
    if (size == 0) {
        throw new IllegalArgumentException("AddLast is failed");
    }
    //位置不在数组内,抛出异常
    if (index < 0 || index > size) {
        throw new IllegalArgumentException("AddLast is failed,Required index>=0 && index<=size");
    }
    //保存要删除的元素
    E ret = data[index];
    //从index+1开始,依次往前移
    for (int i = index + 1; i < size; i++) {
        data[index] = data[i];
    }
    size--;

    //当size为容量的1/4时才进行缩容,防止复杂度的震荡
    if(size==data.length/4 && data.length/2!=0){
        resize(data.length/2);
    }
    return ret;
}

/**
 * 删除第一个元素
 * @return
 */
public E removeFirst(){
    return remove(0);
}

/**
 * 删除最后一个元素
 * @return
 */
public E removeLast(){
    return remove(size-1);
}

/**
 * 从数组中删除元素e
 * @param e
 */
public void removeElement(E e){
    int index=find(e);
    if(index!=-1){
        remove(index);
    }
}

/**
 * 动态数组的定义修改
 * @param newCapacity 新容量
 */
private void resize(int newCapacity){
    E[] newData=(E[])new Object[newCapacity];//创建一个新数组
    for(int i=0;i<size;i++){
        newData[i]=data[i];
    }
    data=newData;//将新数组赋值给原来的数组
}

}

测试函数

public class Main {

public static void main(String[] args) {

    Array<Integer> arr = new Array<>();//创建一个整型数组
    for (int i = 0; i < 10; i++){
        arr.addLast(i);
    }
    System.out.println(arr);

    arr.add(0, 100);
    System.out.println(arr);

    arr.addFirst(-1);
    System.out.println(arr);
    // [-1, 0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    arr.remove(2);
    System.out.println(arr);

    arr.removeElement(4);
    System.out.println(arr);

    arr.removeFirst();
    System.out.println(arr);
}
}

测试结果

Array: size = 10 , capacity = 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Array: size = 11 , capacity = 20
[100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Array: size = 12 , capacity = 20
[-1, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Array: size = 11 , capacity = 20
[-1, 100, 9, 1, 2, 3, 4, 5, 6, 7, 8]
Array: size = 10 , capacity = 20
[-1, 100, 9, 1, 2, 3, 8, 5, 6, 7]
Array: size = 9 , capacity = 20
[7, 100, 9, 1, 2, 3, 8, 5, 6]

猜你喜欢

转载自blog.csdn.net/mys_mys/article/details/83661993