我想要一个数据结构(多线程环境)在Java中,可以容纳最多'n'元素。如果我添加(第n + 1)个元素,那么我应该用这个新元素替换最旧的元素。我知道我可以通过检查每个add()中的大小并以全尺寸进行替换操作来完成。但是,我想知道是否有任何Java库中的数据结构。请帮助在java中的固定大小的数据结构
0
A
回答
3
尝试使用固定大小的数组,并使用索引模数大小进行添加。这就是所谓的圆形阵列,Wikipedia有关于这个问题的体面的文章。
基本上,你跟踪一个索引,你应该写下一个条目,让这个索引环绕缓冲区大小,然后当你继续写时,你会覆盖最老的条目。
事情是这样的:
Object[] ring = new Object[32];
int writeIndex = 0;
public void add(Object o) {
ring[writeIndex % ring.length] = o;
writeIndex++;
}
2
这是一个循环队列并没有Java本地类此。你可以看看ArrayCircularQueue。
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);
}
}
相关问题
- 1. 另一个结构的固定大小数组的结构
- 2. 我不记得固定大小排序树的数据结构
- 3. 固定大小的结构数组的内存问题
- 4. reinterpret_cast结构到一个固定大小的数组
- 5. 在numpy的固定大小的数组中取出固定大小的约束
- 6. 固定大小的数据库 - 优势?
- 7. 固定大小的数组
- 8. 如何在结构中分配固定大小的二维数组?
- 9. 具有固定时间访问和可变大小的数据结构
- 10. 给定结构的大小
- 11. 在java中生成具有固定大小的数字
- 12. Python数据结构的内存大小
- 13. 在安全环境中使用的固定大小结构的联合体
- 14. 在Executors.withFixedSizePool中创建固定大小的数据库连接
- 15. 在Java中定义一个固定大小的列表
- 16. 函数从片中构建固定大小的阵列
- 17. 固定分类列表/数据结构
- 18. 固定大小的阵列不固定
- 19. 固定在Firefox中的字体大小?
- 20. Java中固定大小的数组列表?
- 21. NET中结构的大小
- 22. 结构的大小
- 23. 在可变参数模板中构造固定大小的数组
- 24. 固定大小的头
- 25. Tkinter的create_rectangle()固定大小
- 26. 固定大小的列
- 27. 固定大小的形式
- 28. 在Java中使用的数据结构
- 29. 用Java-FX固定单元大小表
- 30. MongoDB固定大小的数组实现
这将在多线程环境中失败。 – jmg 2011-04-01 10:39:38
@jmg;只有当周围环境没有考虑多线程时(如果你不知道如何执行多线程,java.util.HashMap也会在多线程环境中失败)。无论哪种方式,它并不是要逐字复制,而是要表明原则。 – falstro 2011-04-01 13:24:05