2012-09-27 193 views
1

我已称为NumList一个ADT,并已在一类NumArrayList插入元件插入到数组索引越界的java

的实现的方法

实现它的,有一个插入件(INT I,双值),其中值插入到数组[i]中。

int numItems是一个跟踪我数组元素的计数器。

public void insert(int i, double value) 
{ 
    if (numItems >= items.length) 
    { 
     double[] tempItems = new double [items.length * 2]; 
     for(int j =0 ; j < items.length; j++) 
     { 
      tempItems[j] = items[j]; 

     } 

     tempItems[items.length] = value; 
     items = tempItems; 

    } 

    else 
    { 
     if (i > numItems) 
     { 
      items[numItems] = value; 
     } 

     else 
     { 
      for (int k = i; k < numItems; k++) 
      { 
       items[k+1] = items[k]; 
      } 

      items[i] = value; 
     } 
    } 

    numItems++; 
} 

是我的方法,看起来够简单。

public static void main (String[] args) 
{ 
    NumArrayList test; 
    test = new NumArrayList(); 

    //System.out.println("this is how many initial items the initialized array has."); 
    //System.out.println(test.items); 
    test.insert(1, 0.1); 
    System.out.println("have tried to insert value 0.1 @ position 1, that is the second element in array."); 
    test.print(); 

是我的测试代码区,内置到同一个类中。

我收到一个错误的编译器要求我必须在47行一个ArrayIndexOutOfBoundsException,或在

tempItems[items.length] = value; 

我相信这是想告诉我,我的项目的初始化是错误的,

private double[] items; 
private int numItems; 


public NumArrayList() 
{ 
    items = new double[0]; 
    numItems = 0; 
} 

但是初始化已经被一个比我更好的程序员批准了,这些错误导致我无处可去。也许是对我应该研究的程序的哪一部分有所了解?

回答

0

你要记住,数组总是以指数0开始,而不是1,所以,如果您的数组大小为10,最大的指数为9,而不是10

tempItems[0] = first element; 
tempItems[1] = second element; 

等等等等

假设你有10个元素,你的第十个元素将在tempItems [9]中。尝试访问tempItems [10]会抛出你看到的异常。基本上,如果你正在寻找最后的指数,你想要做的:

tempItems[items.length-1] = value; 

编辑:忘掉这个。您在初始化时将数组索引加倍。参考上面的Thorn的帖子。

+0

这是真的,但在发布的代码中,tempItems.length等于items.length * 2,因此tempItems [items.length]并不是真正的问题。除非当然,如构造函数所示,这两个都是零。 – Thorn

2

您的初始化肯定是错误的。什么是合理的默认大小? ArrayList的答案是10.你可以随心所欲,但不是零!如果用大小为0一倍的数组的长度,新的阵列仍具有长度为0

int capacity; //stores the size of the array (items available) 
int numItems; //stores how many items are actually stored in the array. 

public NumArrayList() { 
    items = new double[10]; 
    numItems = 0; 
    capacity = 10; 
} 
+0

hm我想是的,我的导师和我明白,因为我们正在通过复制/粘贴到缺少数组大小来更改数组的大小,初始化为0是很好的...失败。 – user1702633

0

改变这种

tempItems[items.length] = value; 

tempItems[items.length-1] = value; 

数组索引从0开始,如果你的数组的长度是5,你的最后一个索引应该是4

0

一旦你给一个数组分配了位置,可以说items = new double[0];然后你不能改变数组的大小。如果数组初始化为0,这意味着你有一个无用的数组。你添加的任何东西,它会抛出数组索引超出界限例外。

要走的路是通过使用集合,特别是List接口。

List myList = new List(); //Create an empty list 
myList.add(item); //adds item to List 

也有名单的其他实现,如ArrayListLinkedList等等,可以更好地满足您的需求。