удваивание Размер массива, если полный

87
11

У меня есть массив объектов. Когда массив заполняется, я хочу сделать новый массив в два раза большим, чем старый, и передать все элементы. Я делаю что-то неправильно, я думаю, что это связано с тем, что я не создаю правильную ссылку на новый массив. Здесь мой код, любая помощь в этом будет оценена.

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

спросил(а) 2014-04-12T00:41:00+04:00 6 лет, 2 месяца назад
1
Решение
87

В функции 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

ответил(а) 2014-04-12T00:45:00+04:00 6 лет, 2 месяца назад
39

Я помню, как я делал что-то подобное, когда делал Vector 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;
}

Это работает только в том случае, если каталог был инициализирован нулевым, но перемещение каталога указателей в новый массив.

ответил(а) 2014-04-12T01:22:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема