使用Java动态数组的实现

使用Java中的数组

int[] arr=new int[10];
for(int i=0;i<arr.length;i++)
    arr[i]=i;
int[] scores =new int[]{100,99,66};
for (int i=0;i<scores.length;i++)
    System.out.println(scores[i]);
for(int score:scores)
    System.out.println(score);
scores[0]=98;
for(int score:scores)
    System.out.println(score);


自己实现的动态数据

public class Array<E> {
    private E[] data;
    private int size;

    /**
     *构造函数,传入数组的容量capacity构造Array
     */
    public Array(int capacity){
        data = (E[])new Object[capacity];
        size=0;
    }

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

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

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

    // 返回数组是否为空
    public boolean isEmpty(){
        return  size==0;
    }

    // 向所有元素后添加一个新元素,O(1)
    public void addLast(E e){
//        if(size==data.length)
//            throw new IllegalArgumentException("AddLast failed!");
//        data[size]=e;
//        size++;
     add(size,e);
    }

    // 在所有元素前添加一个新元素,O(1)
    public void addFirst(E e){
        add(0, e);
    }

    //在第index个位置插入一个新元素e,O(n/2)=O(n)
    public void add(int index,E 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++;
    }

    //获取index索引位置的元素,O(1)
    public E get(int index){
        if(index<0 || index>=size)
            throw new IllegalArgumentException("Get failed.Index is illegal.");
        return data[index];
    }

    //修改index索引位置的元素为e,O(1)
    void set(int index,E e){
        if(index<0 || index>=size)
            throw new IllegalArgumentException("Set failed.Index is illegal.");
        data[index]=e;
    }

    //查找数组中是否有元素e,O(n)
    public boolean contains(E e){
        for (int i =0 ; i<size;i++){
            if(data[i].equals(e))
                return true;
        }
        return false;
    }

    // 查找数组中元素e所在的索引,如果不存在元素e,则返回-1,O(n)
    public int find(E e){
        for (int i =0 ; i<size;i++){
            if(data[i].equals(e))
                return i;
        }
        return -1;
    }

    // 从数组中删除index位置的元素, 返回删除的元素,O(n)
    public E remove(int index){
        if(index<0 || index>=size)
            throw new IllegalArgumentException("Remove failed.Index is illegal.");
        E ret=data[index];
        for(int i = index+1;i<size;i++)
            data[i-1]=data[i];
        size--;
        data[size]=null;//loitering objects != memory leak

        if(size == data.length / 2)
            resize(data.length / 2);
        return ret;
    }

    // 从数组中删除第一个元素, 返回删除的元素
    public E removeFirst(){
        return remove(0);
    }

    //// 从数组中删除最后一个元素, 返回删除的元素
    public E removeLast(){
        return remove(size-1);
    }

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

    @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();
    }

    // 将数组空间的容量变成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) {

//        int[] arr=new int[10];
//        for(int i=0;i<arr.length;i++)
//            arr[i]=i;
//        int[] scores =new int[]{100,99,66};
//        for (int i=0;i<scores.length;i++)
//            System.out.println(scores[i]);
//        for(int score:scores)
//            System.out.println(score);
//        scores[0]=98;
//        for(int score:scores)
//            System.out.println(score);


           Array<Integer> arr=new Array<>();
           for (int i=0;i<10;i++)
               arr.addLast(i);
           System.out.println(arr);

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

           arr.addFirst(-1);
           System.out.println(arr);

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

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

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

    }
}

自己定义一个Student类,来验证刚才实现的动态数组

public class Student {

    private String name;
    private int score;

    public Student(String studentname,int studentScore){
        name =studentname;
        score=studentScore;
    }

    @Override
    public String toString(){
        return String.format("Student(name: %s,score: %d)",name,score);
    }

    public static void main(String[] args) {
        Array<Student> arr=new Array<>();
        arr.addLast(new Student("Alice",100));
        arr.addLast(new Student("Bob",66));
        arr.addLast(new Student("David",88));
        System.out.println(arr);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_25366173/article/details/80299046