HashTable - Массив, изменяющий размер в середине перефразирования - PullRequest
0 голосов
/ 08 ноября 2018

Я не уверен, что происходит с моим HashTable. Но у меня есть его, где, если массив заполнен более чем наполовину, он будет перефразировать и помещать непустые значения в новый массив двойного размера. Но по какой-то причине в середине перефразирования массив, кажется, возвращается к первоначальному размеру, поэтому я получаю ошибку IndexOutofBounds, и я не уверен, почему ...

Вот код, который я получил:

public class HashTable {

public static void main(String[] args) {
    HashTable table = new HashTable(13);
    table.addItem(5, table.theTable);
    table.addItem(23, table.theTable);
    table.addItem(17, table.theTable);
    table.addItem(8,table.theTable);
    table.addItem(24, table.theTable);
    table.addItem(15, table.theTable);
    table.addItem(2, table.theTable);
    table.addItem(46, table.theTable);

    table.displayTable();


}

int size;
int count;
int[] theTable;

static int EMPTY = -1;
static int DELETED = -2;

HashTable(int size) {
    this.size = size;
    this.count = 0;
    this.theTable = new int[size];

    for(int i = 0; i < size; i++) {
        this.theTable[i] = EMPTY;
    }
}


void addItem(int value, int[] arr) {
    //Check if array is > half full
    int loadSize = size/2;
    if(count > loadSize) {

        rehash();

    }       
    System.out.println("Size: " + size);
    System.out.println("Length " + arr.length);

    int index = hasher(value);

    while(arr[index] != EMPTY && arr[index] != DELETED) {
        index++;
        if(index >= arr.length - 1) {
            index = 0;
        }
    }
    count++;
    arr[index] = value;
}//END addItem

int hasher(int value) {
    return value % size;
}

void rehash() {
    int[] temp = new int[size*2];

    for(int i = 0; i < size*2; i++) {
        temp[i] = EMPTY;
    }
    size = size *2;
    for(int i = 0; i < theTable.length - 1; i++) {
        int value = theTable[i];
        if(value != EMPTY && value != DELETED) {
            this.addItem(value, temp);
        }
    }


    theTable = temp;
}

Я, честно говоря, не уверен, почему все идет не так. Но при тестировании в main после вызова rehash выдается, что длина и размер равны 26 (удвоены). Но при попытке добавить 46 размер все равно говорит 26, но тогда arr.length сейчас 13 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...