Мне нужно создать метод перераспределения для HashSet. Я реализую метод add и remove таким образом, чтобы увеличивать или уменьшать его размер, если коэффициент загрузки больше 1 или меньше 0,5 соответственно. LoadFactor = elements / size из набора. Пока это моя работа, но я начинаю терять элементы всякий раз, когда мне нужно увеличить размер моего набора.
public void reallocate() {
double loadFactor = (double) currentSize / buckets.length;
Node[] newBuckets;
if (loadFactor > 1) {
newBuckets = new Node[buckets.length * 2];
for (Node bucket : buckets) {
if (bucket != null) {
int h = bucket.hashCode();
h = Math.abs(h % newBuckets.length);
newBuckets[h] = bucket;
}
}
buckets = newBuckets;
} else if (loadFactor < 0.5) {
newBuckets = new Node[buckets.length / 2];
for (Node bucket : buckets) {
if (bucket != null) {
int h = bucket.hashCode();
h = Math.abs(h % newBuckets.length);
newBuckets[h] = bucket;
}
}
buckets = newBuckets;
}
}
Исходный массив - это сегменты, и я создаю newBuckets с выбранным размером. Использовал цикл для копирования каждого элемента в newBuckets, а затем установил buckets = newBuckets. Я бы предпочел несколько советов вместо того, чтобы дать мне решение, так как я хочу научиться делать это.