如果已满,则加倍数组大小

时间:2014-04-11 21:41:29

标签: java arrays

我有一个对象数组。当数组填满时,我想创建一个比旧数组大两倍的新数组,并将所有元素转移过来。我做错了什么,我觉得它与我没有创建对新数组的正确引用有关。这是我的代码,任何帮助解决这个问题都将受到赞赏。

    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;
}

2 个答案:

答案 0 :(得分: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

注意: 我个人更喜欢使用此指针来引用类属性,以便它使我的代码更具可读性,并且每个人都清楚该变量有问题是一个类属性而不是局部变量。

** SIZE此时已经翻了一番。无需倍数2

答案 1 :(得分:0)

我记得在制作Vector ADT时做了类似的事情。但是,我在代码中使用了实例变量而不是方法来获取元素编号和容量。我绝对没有在Vector的方法中初始化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时才有效,但是,将指针目录移动到新数组。