如何修复LinkedHashSet的大小?

时间:2018-03-08 10:38:56

标签: java hash set

我需要一个固定大小为n的LinkedHashSet,这样当我们插入第n + 1个元素时,第一个元素会被自动删除,并且最后会插入新元素。

LinkedHashSet <Integer> = new LinkedHashSet <Integer> () ;

我应该如何实现构造函数来修复大小?

2 个答案:

答案 0 :(得分:1)

默认情况下,LinkedHashSet不具备此功能。您可以在此处了解原因:https://stackoverflow.com/a/7632240/9337345

你唯一能做的就是创建一个继承的LinkedHashSet,它负责你想要的固定大小。

例如:

import java.util.Iterator;
import java.util.LinkedHashSet;

public class MyLinkedHashSet<T> extends LinkedHashSet<T> {
    private long maxSize;

    public MyLinkedHashSet(long maxSize) {
        this.maxSize = maxSize;
    }

    @Override
    public boolean add(T item) {
        if(size() == maxSize) {
            removeFirst();
        }
        return super.add(item);
    }

    private void removeFirst() {
        if(size() > 0) {
            Iterator<T> iterator = iterator();
            T item = iterator.next();
            remove(item);
        }
    }

    public static void main(String[] args) {
        LinkedHashSet<Integer> set = new MyLinkedHashSet<>(3);
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        System.out.println(set);    // [2, 3, 4]
        set.clear();
        System.out.println(set);    // []
        set.addAll(Arrays.asList(1, 2, 3, 4, 5));
        System.out.println(set);    // [3, 4, 5]
    }
}

我希望这就是你的意思。

答案 1 :(得分:0)

要在java中实现固定大小的LinkedHashSet,我们将执行以下操作:

  1. 根据[LinkedHashSet]的来源(new LinkedHashMap(16,.75f)),它基于LinkedHashMap的实现
  2. 在查看LinkedHashMap的文档后,我们发现它有一个名为[removeEldestEntry](https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html#removeEldestEntry(java.util.Map.Entry))的方法,我们可以将其用于自动删除的目的
  3. 最终,我们将进行以下实施:

    Set<Integer> unnamedVariable = Collections.newSetFromMap(new LinkedHashMap<Integer, Boolean>() {
    
        @Override
        protected boolean removeEldestEntry(Map.Entry<Integer, Boolean> eldest) {
            return this.size() > n;
        }
    
    });
    

    与使用迭代器手动删除最后一个条目相比,这为我们提供了一个高性能的解决方案,因为我们重新使用了后端层的现有功能。