class HashDemo{
private Integer[] array;
private int size;
private final static int DEFAULT_CAPACITY = 5;
private int capacity;
public int size() {
return size;
}
public HashDemo(int capacity) {
this.capacity = capacity;
array = new Integer[capacity];
}
public HashDemo() {}
public boolean put(int val) {
checkSpace();
int index = hash(val);
if (array[index] != null) {
index = rehash(index);
}
array[index] = val;
return true;
}
public boolean checkSpace() {
if (++size > capacity) {
if (capacity == 0) {
capacity = DEFAULT_CAPACITY;
array = new Integer[DEFAULT_CAPACITY];
} else {
int new_capacity = capacity + (capacity >> 1);
capacity = new_capacity;
Integer[] new_array = move(array, capacity);
array = new_array;
}
}
return true;
}
public Integer[] move(Integer[] old, int new_capacity) {
Integer[] new_array = new Integer[new_capacity];
for (int i = 0;i < old.length;i++) {
new_array[i] = old[i];
}
return new_array;
}
public boolean search(Integer val){
if (array == null) {
return false;
}
int index = hash(val);
int index0 = index;
Integer obj = array[index];
if (val == null && obj == null) { return true; }
if (val != null && val.equals(obj)) { return true; }
while (val != array[index % capacity]) {
if (++index % capacity == index0) {
return false;
}
}
return true;
}
public int hash(int key) {
return key % capacity;
}
public int rehash(int index) {
while (true) {
if (array[ index % capacity ] != null) {
index = index + 1;
} else {
return index;
}
}
}
}