我正在编写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();
}
}
在此先感谢您的帮助..
答案 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 您无法动态调整数组大小。