Javaダイナミック配列を使用した実装


Javaの配列の使用
int[] arr=new int[10];
for(int i=0;ilength;i++)
    arr[i]=i;
int[] scores =new int[]{100,99,66};
for (int i=0;ilength;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
", 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[i]=i;
//        int[] scores =new int[]{100,99,66};
//        for (int i=0;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 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 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);
    }
}