我想要一個數據結構(多線程環境)在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. 固定大小的Java隊列數據結構
- 2. 固定大小結構
- 3. 另一個結構的固定大小數組的結構
- 4. 我不記得固定大小排序樹的數據結構
- 5. Marshaled結構後跟固定大小的數據
- 6. 固定大小的結構數組的內存問題
- 7. reinterpret_cast結構到一個固定大小的數組
- 8. 在numpy的固定大小的數組中取出固定大小的約束
- 9. 數據結構網絡化與固定的大小和獨特的元素
- 10. 固定大小的數據庫 - 優勢?
- 11. 固定大小的數組
- 12. 固定大小堆棧Java
- 13. 如何在結構中分配固定大小的二維數組?
- 14. 具有固定時間訪問和可變大小的數據結構
- 15. 給定結構的大小
- 16. 在java中生成具有固定大小的數字
- 17. 在C#中的結構中創建固定大小的字符串?
- 18. Python數據結構的內存大小
- 19. 在安全環境中使用的固定大小結構的聯合體
- 20. 在Executors.withFixedSizePool中創建固定大小的數據庫連接
- 21. 在Java中定義一個固定大小的列表
- 22. 函數從片中構建固定大小的陣列
- 23. 固定分類列表/數據結構
- 24. 固定大小
- 25. 固定大小的陣列不固定
- 26. 固定在Firefox中的字體大小?
- 27. Java中固定大小的數組列表?
- 28. NET中結構的大小
- 29. 結構的大小
- 30. 將數字的動態數組重構爲固定大小
這將在多線程環境中失敗。 – jmg 2011-04-01 10:39:38
@jmg;只有當週圍環境沒有考慮多線程時(如果你不知道如何執行多線程,java.util.HashMap也會在多線程環境中失敗)。無論哪種方式,它並不是要逐字複製,而是要表明原則。 – falstro 2011-04-01 13:24:05