Я не уверен, что происходит с моим 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 ...