Перераспределение метода для HashSet - PullRequest
0 голосов
/ 27 апреля 2018

Мне нужно создать метод перераспределения для 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. Я бы предпочел несколько советов вместо того, чтобы дать мне решение, так как я хочу научиться делать это.

...