2009-01-07 32 views
9

Có một kỹ thuật nào để tôi có thể chỉ định một số n sao cho khi mục nhập (n + 1) được chèn vào, mục cũ nhất được gỡ bỏ đầu tiên, đảm bảo rằng kích thước của hashtable luôn bị giới hạn ở n?Làm cách nào để hạn chế số lượng mục nhập trong java hashtable?

+0

Điều này tương tự như http://stackoverflow.com/questions/272674/what-is-a-data-structure-kind-of-like-a-hash-table-but-infrequently-used-keys -ar. Câu hỏi cung cấp một giải pháp. –

+0

@robhruska - bạn có nghĩ điều này được tính là trùng lặp không? Tôi đang ở trên hàng rào. –

+0

Tôi không chắc chắn. Các quan điểm có một chút khác biệt, vì câu hỏi này hỏi về "giới hạn kích thước" trong khi câu hỏi khác nhắm mục tiêu "các mục nhập không thường xuyên được sử dụng". Tôi không phản đối việc mở nó ra, nếu chỉ để có thêm khả năng tìm kiếm cho những người nhìn nó từ góc độ của câu hỏi này. –

Trả lời

5

Bạn đang tìm kiếm một LRU cache có lẽ? Dưới đây là bài đăng trên blog dựa trên số LinkedHashMap.

+0

Tôi đã đề cập đến LinkedHashMap, mà tôi đã sử dụng cho bộ nhớ cache LRU gần đây. –

0

Bạn có thể muốn xem xét sử dụng Bộ sưu tập Apache. Họ có một loạt các triển khai LRU. Nếu không, bạn có thể dễ dàng viết một trình bao bọc tương tự cho các bộ sưu tập thư viện chuẩn; Tôi không nghĩ rằng bạn có thể sử dụng trực tiếp.

0

Bạn có thể sử dụng hàng đợi có hai hàng hoặc Deque và chỉ xóa mục đầu tiên khi bạn đang ở số lượng tối đa.

-1

Nếu bạn đang lưu vào bộ nhớ đệm, bạn có thể sử dụng WeakHashMap hoặc WeakReference và sau đó không phải lo lắng về kích thước của bộ nhớ cache.

+2

Chỉ cần làm rõ để tránh tuyên truyền một quan niệm sai lầm phổ biến: WeakHashMap KHÔNG thích hợp cho bộ nhớ đệm LRU của chính nó; nó sử dụng WeakReferences cho KEYS, chứ không phải VALUES. Đó là lý tưởng để giữ siêu dữ liệu về các đối tượng không 'thuộc về' đối với bạn; không cho các mục nhập giả định sẽ bị loại bỏ khi hết bộ nhớ – Cowan

27

LinkedHashMap thực hiện chính xác điều đó, hãy xem javadoc cho phương pháp removeEldestEntry.

Something như thế này nên làm các trick, điều này sẽ loại bỏ các mục chèn lâu đời nhất:

Map map = new LinkedHashMap() { 
    @Override 
    protected boolean removeEldestEntry(Entry eldest) { 
     return size() > N; 
    } 
}; 

Bạn cũng có thể loại bỏ lâu đời nhất entry được truy cập bằng cách xác định nó trong các nhà xây dựng:

Map map = new LinkedHashMap(16, 0.75f, true) { 
     @Override 
     protected boolean removeEldestEntry(Entry eldest) { 
      return size() > N; 
     } 
    }; 
0

Nếu bạn có nhu cầu đồng thời, đừng cố tự mình giải quyết vấn đề này. Phương thức của một số phương pháp .maximumSize() cho phép bạn giới hạn kích thước của bản đồ, mặc dù tôi hiểu rằng các mục cũ có thể được dọn sạch trước khi bạn thực sự đạt tới giới hạn.

an interesting page về thiết kế của cấu trúc dữ liệu, điều này sẽ gây ấn tượng với người đọc về mức độ khó thực hiện tốt hơn so với triển khai của Google. :)

Các vấn đề liên quan