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 * */{();();//Get element at rankpublic Object getAtRank(int position) throws ExceptionBoundaryExceed;(int position,Object element) throws ExceptionBoundaryExceed;(int position,Object element) throws ExceptionBoundaryExceed;(int position) throws ExceptionBoundaryExceed;();}

自定义ExceptionBoundaryExceed类:

package com.vector_and_array;/** * @author gannyee * Exception for boundaryExceed */{(String message){super(message);}}

Vector具体实现 VectorBasicOnArray类:

package com.vector_and_array;import java.util.Arrays;{CAPACITY = 1024;size;//Declared array for vectorObject[] array;(){size = 0;array = new Object[CAPACITY];}() {return size;}() {return size == 0;}@Overridepublic Object getAtRank(int position) throws ExceptionBoundaryExceed{if(position < 0 || position > size)throw new ExceptionBoundaryExceed(“Vector exceed! “);return array[position];}(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);}(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);}(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 –;}() {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 classVectorBasicOnArrays 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();}}因害怕失败而不敢放手一搏,永远不会成功

Java 基于数组自定义实现容量不可变向量Vector

相关文章:

你感兴趣的文章:

标签云: