2012-09-27 144 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等等,可以更好地滿足您的需求。