如何根据用户/程序员在运行时需要自动增加数组的大小?

时间:2018-02-01 20:03:00

标签: java arrays arraylist vector collections

我正在编写Java的Vector类和Java的所有其他集合类的代码,但是我遇到了如何在运行时自动增加数组大小的问题。 并且程序正常运行而不给出“数组超出范围的异常” .. 好吧,这是我的代码

/* Developed By: Nitin_Khanna Date: 1/February/2018 Github Username:beNitinhere Twitter Username:beNitinhere */ class Vector{ private static int[] A; public static long length; //Default size of Vector is 10 Vector(){ length+=10; A= new int[10]; } //One-parameterized Costructor Vector(int n){ length+=n; A= new int[n]; } //get public void get(){ int []B=new int[5]; for(int i=0;i<length();i++){ System.out.println(A[i]); } } //lenght public static long length(){ return length; } //removeLastElement public void removeLastElement(){ length=length-1; } //removeFirstElement public void removeFirstElement(){ for(int i=0;i<length();i++){ A[i]=A[i+1]; } } //clear public void clear(){ length=0; } //add public void add(int num,int index){ if(index>length()){ set(); } A[index]=num; } //remove public void remove(int index){ for(int i=index;i<length();i++){ A[i]=A[i+1]; } length-=1; } //firstElementIs public int firstElementIs(){ return A[0]; } //lastElementIs public int lastElementIs(){ return A[(int)length()-1]; } //elementAt public int elementAt(int index){ return A[index]; } private void set(){ length*=2; A=new int[(int)length]; } public void size(){ } // public boolean isEmpty(){ // } public static void main(String args[]){ Vector v1=new Vector(5); for(int i=0;i<=10;i++){ v1.add(i,i); } v1.get(); v1.removeLastElement(); System.out.println("After calling removeLastElement function"); v1.get(); System.out.println("After calling remove function"); v1.remove(2); v1.get(); } }

在此先感谢您的帮助..

3 个答案:

答案 0 :(得分:3)

没有办法这样做,但你可以使用LinkedList或实现你自己的解决方案(Ziakad在评论部分是正确的,当他说这应该被放入Vector类。我只是给了一个一般描述,但在问题的上下文中这是一个很好的建议):

public static int[] raiseSize(int[] input, int newSize) {
    int[] output = new int[newSize];
    for (int i = 0; i < input.length; i++) output[i] = input[i];
    return output;
}

用法示例:

int foo[] = new int[3];
foo[0] = 1; foo[1] = 2; foo[2] = 0;
foo = raiseSize(foo, 5);

答案 1 :(得分:2)

阅读上面的@notyou评论。你应该做的是MAKE另一个长度增加的数组,将所有元素(从旧数组)复制到这个数组中,然后告诉你新代码(NOW)是数据数组的代码。

答案 2 :(得分:0)

考虑如何实现数组:指定数组的大小&#34;提前,&#34;然后运行时会留出足够的连续内存位置来保存指定大小的数组。这意味着数组不能动态调整大小 - 你不知道在结尾之后的下一个连续内存位置中的内容阵列。这是一个大小为6的布尔值数组的插图:

--------------------------------------------------------------------------------------
| true  |  false | false | true | true | true (last item in the array) | ?? | ?? | ...
--------------------------------------------------------------------------------------
|  0    |   1    |  2    |  3   |  4   | 5...

旁注:这是一个有趣的属性,您可以使用以下公式计算出任何特定项目的内存地址:(initial memory location) + (array index * size of each memory location)。例如,如果数组从位置100开始并且每个位置的大小为2,则数组中的第一个项目位于100 + (2 * 0) = 100位置。索引3处的项目位于100 + (2 * 3) = 106位置。这就是为什么你可以在恒定时间内访问数组中的任意位置的原因 - 你可以做指针运算来找到任意索引处项目的位置。

TL; DR 您无法动态调整数组大小。