我需要一个固定大小为n的LinkedHashSet,这样当我们插入第n + 1个元素时,第一个元素会被自动删除,并且最后会插入新元素。
LinkedHashSet <Integer> = new LinkedHashSet <Integer> () ;
我应该如何实现构造函数来修复大小?
答案 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,我们将执行以下操作:
LinkedHashSet
]的来源(new LinkedHashMap(16,.75f)),它基于LinkedHashMap
的实现LinkedHashMap
的文档后,我们发现它有一个名为[removeEldestEntry
](https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html#removeEldestEntry(java.util.Map.Entry))的方法,我们可以将其用于自动删除的目的最终,我们将进行以下实施:
Set<Integer> unnamedVariable = Collections.newSetFromMap(new LinkedHashMap<Integer, Boolean>() {
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Boolean> eldest) {
return this.size() > n;
}
});
与使用迭代器手动删除最后一个条目相比,这为我们提供了一个高性能的解决方案,因为我们重新使用了后端层的现有功能。