我想要一个java中的数据结构(多线程环境),它最多可以包含'n'个元素。如果我添加第(n + 1)个元素,那么我应该用这个新元素替换最旧的元素。我知道我可以通过检查每个add()的大小并以完整大小进行替换操作来实现。但是,我想知道java库中是否有任何数据结构。请帮忙
答案 0 :(得分:3)
尝试使用固定大小的数组,并使用索引模数大小添加。这被称为圆形阵列,Wikipedia有关于这个主题的不错的文章。
基本上,你跟踪一个你应该编写下一个条目的索引,并让该索引环绕缓冲区大小,然后当你继续写入时,你将覆盖最旧的条目。
这样的事情:
Object[] ring = new Object[32];
int writeIndex = 0;
public void add(Object o) {
ring[writeIndex % ring.length] = o;
writeIndex++;
}
答案 1 :(得分:2)
这是一个循环队列,没有java本地类。你可以看一下ArrayCircularQueue。
答案 2 :(得分:2)
根据您的需要,一种方法是包装LinkedHashMap的子类。
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
public class FixedSizeSet<E> extends AbstractSet<E> {
private final LinkedHashMap<E, E> contents;
FixedSizeSet(final int maxCapacity) {
contents = new LinkedHashMap<E, E>(maxCapacity * 4 /3, 0.75f, false) {
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<E, E> eldest) {
return size() == maxCapacity;
}
};
}
@Override
public Iterator<E> iterator() {
return contents.keySet().iterator();
}
@Override
public int size() {
return contents.size();
}
public boolean add(E e) {
boolean hadNull = false;
if (e == null) {
hadNull = contents.containsKey(null);
}
E previous = contents.put(e, e);
return e == null ? hadNull : previous != null;
}
@Override
public boolean contains(Object o) {
return contents.containsKey(o);
}
}