2014-04-11 85 views
0

我有一個對象數組。當數組填滿時,我想創建一個新的數組,它的大小是舊數組的兩倍,並將所有元素轉移過來。我做錯了什麼,我認爲它與我做的事情沒有創建對新陣列的正確引用。這是我的代碼,任何幫助解決這個問題將不勝感激。加倍數組大小(如果已滿)

private int DIRECTORY_SIZE = 6; 
Entry [] directory = new Entry[DIRECTORY_SIZE]; 
private int numberOfElements = 0; 

public int getNumOfElements(){ 
    return numberOfElements; 
} 

public void setDirectorySize(int size){ 
    DIRECTORY_SIZE = size; 
} 

public int getDirectorySize(){ 
    return DIRECTORY_SIZE; 
} 




public void addEntry(String surname, String initial, String num) { 
    // TODO add an entry to an array, also increments numberOfElements variable tracking whats in array 

    if(getNumOfElements() == getDirectorySize()){ // if array is full 
     doubleArraySize();  // put temp values into new bigger directory array 

    } 

    int i = findFreeLocation();  
    directory[i] = new Entry(surname, initial, num); 
    numberOfElements++; 
} 


private void doubleArraySize(){ 
    Entry[] temp = new Entry[DIRECTORY_SIZE]; //make new temp array same size as old one 
    for(int i = 0; i < DIRECTORY_SIZE ; i++){ 
     temp[i] = directory[i];     // cycle through array putting all values into temp 
               // works up to here 
    } 

    setDirectorySize(DIRECTORY_SIZE*2);    // double size of array 


    Entry[] directory = new Entry[DIRECTORY_SIZE]; // create new, double size directory array 
    for(int i = 0; i < temp.length ; i++){ 
     directory[i] = temp[i]; 
    } 

} 

private int findFreeLocation() { 

    int i; 
    for (i = 0; i < DIRECTORY_SIZE; i++) 
    {   
     if(directory[i] == null) 
     { 
      break; 
     } 
    } 
    return i; 
} 
+1

出於好奇,你爲什麼重新發明這個輪子? 'ArrayList'增長(不是雙打,IIRC它做150%的東西),爲什麼不使用它? –

+1

「我有一個對象數組,當數組填滿時,我想創建一個新的數組,它的大小是舊數組的兩倍,並將所有元素轉移過來」 - 您是否知道這基本上是ArrayList的作用? –

+1

此外,VARIABLE_NAMES_IN_CAPITALS通常是常量 - 在你的情況下,DIRECTORY_SIZE是*不*常量。這很混亂。 –

回答

4

在doubleArraySize()函數,這是問題:

Entry[] directory = new Entry[DIRECTORY_SIZE]; 
// you are not assigning it to the class attribute directory 
// instead you are creating a local array directory 

做出如下變化:

this.directory = new Entry[DIRECTORY_SIZE]; 
// this will assign the newly created array to the class attribute 

注:我個人更喜歡使用這個指針引用類的屬性,以便它使我的代碼更具可讀性,並且每個人都清楚這個變量的任務ion是一個類屬性而不是局部變量。

** SIZE已經加倍了這一點。沒有必要通過2多個

+0

非常感謝。我有一種感覺,就是這樣,但我無法追蹤它 –

+0

@JohnSetter不客氣 – Kakarot

0

我記得做一些完全像這樣的事情時,我正在做矢量ADT。但是,我使用實例變量而不是我的代碼中的元素編號和容量的方法。我絕對沒有初始化矢量內部的Vector方法。

setDirectorySize(DIRECTORY_SIZE*2);    // double size of array 


Entry[] directory = new Entry[DIRECTORY_SIZE]; // create new, double size directory array 

是不是DIRECTORY_SIZE的一個實例變量?因爲如果是這樣,我不認爲你可以使用你覆蓋的對象的實例變量初始化一個對象。

把我的代碼到你的情況下,它會是這個樣子:

private void doubleDirectorySize() 
{  
    Entry[] new_array = new Entry[new_directory_size*2]; 
    for (int i = 0; i < directory_size; i++) 
    { 
     new_array[i]= directory[i]; 
    } 
    directory= new_array; 
} 

這隻能如果目錄被初始化爲null,雖然移動指針目錄複製到新陣列。