Java 基於數組自訂實現容量不可變向量Vector

來源:互聯網
上載者:User

標籤:java   vector   向量   數組實現定長向量   

背景:假定集合 S 由 n 個元素組成,它們按照線性次序存放,於是我們就可以直接存取其中的第一個元素、第二個元素、第三個元素……。也就是說,通過[0, n-1]之間的每一個整數,都可以直接存取到唯一的元素 e,而這個整數就等於 S 中位於 e 之前的元素個數??在此,我們稱之為該元素的秩( Rank)。不難看出,若元素 e 的秩為 r,則只要 e 的直接前驅(或直接後繼)存在,其秩就是 r-1(或 r+1)。這一定義與 Java、 C++之類的程式語言中關於數組元素的編號規則是一致的。支援通過秩直接存取其中元素的序列,稱作向量( Vector)或數組列表( Array list)。實際上,秩這一直觀概念的功能非常強大,它可以直接指定插入或刪除元素的位置。

向量ADT各方法定義如下:

基於數組,可以直接實現向量 ADT。我們借用一個數組 array[],其中 array[i]分別存放一個引用,指向秩為position 的向量元素。為此, array[]的容量 CAPACITY 需要足夠大,還需要設定一個執行個體變數 size 指示向量的實際規模。

具體代碼實現:
Vector 介面:

/** * Vector Interface */package com.vector_and_array;/** * @author gannyee * */public interface VectorInterface {    //Get size of vector    public int getSize();    //Is empty    public boolean isEmpty();    //Get element at rank    public Object getAtRank(int position) throws ExceptionBoundaryExceed;    //Replace element at rank    public void replaceAtRank(int position,Object element) throws ExceptionBoundaryExceed;    //Insert element at rank    public void insertAtRank(int position,Object element) throws ExceptionBoundaryExceed;    //Remove element at rank    public void removeAtRank(int position) throws ExceptionBoundaryExceed;    //Travel all elements    public void getAllelements();}

自訂ExceptionBoundaryExceed類:

package com.vector_and_array;/** * @author gannyee * Exception for boundaryExceed */public class ExceptionBoundaryExceed extends Exception{    //Constructor overload    public ExceptionBoundaryExceed(String message){        super(message);    }}

Vector具體實現
VectorBasicOnArray類:

package com.vector_and_array;import java.util.Arrays;public class VectorBasicOnArrays implements VectorInterface {    //Define static variable    private static final int CAPACITY = 1024;    //Declared size of vector    private static int size;    //Declared array for vector    Object[] array;    //Constructor    public VectorBasicOnArrays(){        size = 0;        array = new Object[CAPACITY];    }    @Override    public int getSize() {        return size;    }    @Override    public boolean isEmpty() {        return size == 0;    }    @Override    public Object getAtRank(int position) throws ExceptionBoundaryExceed{        if(position < 0 || position > size)            throw new ExceptionBoundaryExceed("Vector exceed! ");        return array[position];    }    @Override    public void replaceAtRank(int position, Object element) throws ExceptionBoundaryExceed{        if(position < 0 || position > size)            throw new ExceptionBoundaryExceed("Vector exceed! ");        array[position] = element;        System.out.println("Element replaced is: " + array[position] + " at position: " + position);    }    @Override    public void insertAtRank(int position, Object element) throws ExceptionBoundaryExceed{        if(position < 0 || position > size)            throw new ExceptionBoundaryExceed("Vector exceed! ");        if(size > CAPACITY)            throw new ExceptionBoundaryExceed("Vector overflow! ");        for(int i = size;i >= position;i --)            array[i + 1] = array[i];        array[position] = element;        size ++;        System.out.println("Element you insert is: " + element + " at position: " + position);    }    @Override    public void removeAtRank(int position) throws ExceptionBoundaryExceed{        if(position < 0 || position > size)            throw new ExceptionBoundaryExceed("Vector exceed! ");        System.out.println("Element you remove is: " + array[position]);        for(int i = position;i <= size - 1;i ++)            array[i] = array[i + 1];        size --;    }    @Override    public void getAllelements() {        Object[] arrayTravel = new Object[size];        for(int i = 0;i < arrayTravel.length;i ++)            arrayTravel[i] = array[i];        System.out.println("All elements are: " + Arrays.toString(arrayTravel));    }}

測試代碼:

package com.vector_and_array;/** * Test * @author gannyee * */public class VectorTest {    public static void main(String[] args) throws ExceptionBoundaryExceed {        //Define VectorBasicOnArrat class        VectorBasicOnArrays vba = new VectorBasicOnArrays();        System.out.println("Size: " + vba.getSize());        System.out.println("Is empty? " + vba.isEmpty());        vba.insertAtRank(0, 1);        vba.insertAtRank(1, 2);        vba.insertAtRank(2, 3);        vba.insertAtRank(3, 4);        vba.insertAtRank(4, 5);        vba.insertAtRank(5, 6);        vba.insertAtRank(5, 7);        vba.insertAtRank(6, 8);        System.out.println("Size: " + vba.getSize());        System.out.println("Is empty? " + vba.isEmpty());        vba.getAllelements();        vba.replaceAtRank(0, 12);        vba.replaceAtRank(1, 13);        vba.replaceAtRank(2, 14);        vba.replaceAtRank(3, 15);        System.out.println("Size: " + vba.getSize());        System.out.println("Is empty? " + vba.isEmpty());        vba.getAllelements();        vba.removeAtRank(7);        vba.removeAtRank(5);        vba.removeAtRank(4);        vba.removeAtRank(1);        vba.removeAtRank(0);        System.out.println("Size: " + vba.getSize());        System.out.println("Is empty? " + vba.isEmpty());        vba.getAllelements();    }}

測試結果:

Size: 0Is empty? trueElement you insert is: 1 at position: 0Element you insert is: 2 at position: 1Element you insert is: 3 at position: 2Element you insert is: 4 at position: 3Element you insert is: 5 at position: 4Element you insert is: 6 at position: 5Element you insert is: 7 at position: 5Element you insert is: 8 at position: 6Size: 8Is empty? falseAll elements are: [1, 2, 3, 4, 5, 7, 8, 6]Element replaced is: 12 at position: 0Element replaced is: 13 at position: 1Element replaced is: 14 at position: 2Element replaced is: 15 at position: 3Size: 8Is empty? falseAll elements are: [12, 13, 14, 15, 5, 7, 8, 6]Element you remove is: 6Element you remove is: 7Element you remove is: 5Element you remove is: 13Element you remove is: 12Size: 3Is empty? falseAll elements are: [14, 15, 8]

相關文字借鑒引用 資料結構與演算法( Java 描述)鄧俊輝 著

未完待續。。。。
基於數組自訂實現容量可變的向量Vector!

源碼在github上:https://github.com/gannyee/JavaDataStruct

Java 基於數組自訂實現容量不可變向量Vector

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.