java正在寻找保持大小的数据结构,并清除流程中的旧元素 1 周,1 日 Questions & Answers 108 Usecase维护最近n个访问URL的列表(其中n是一个固定数字)。当新的URL添加到列表中时,旧的URL会自动删除(以保持n个元素) 要求数据结构需要按时间排序(如果接受比较器,应该没有问题)
# 1 楼答案 重写TreeSet并为URL创建一个Proxy,它还存储访问的时间。 然后创建一个Comparator或实现Comparable并覆盖equals和hashCode 对于重写TreeSetthis可以帮助您 您需要重写add方法。因为您可能不需要addAll,所以可以抛出一个UnsupportedOperationException 在这之后,您应该会很好,您甚至可以做一些事情,比如每次访问时都会存储重访的URL(这意味着指向同一URL的不同代理URL)或每个URL只存储一个条目。这取决于如何定义equals(以及相应的hashCode,分别是compare) 方法 小心:TreeSet使用compare方法进行相等检查,不使用相等方法
# 2 楼答案 你需要一个循环缓冲区 只需保留一个大小为N、索引为k的数组b[],它指向最早的URL。每次需要添加新URL时,将其分配给b[k]并增加k,如果需要,将其包装:k=(k+1)%N 所有的URL都会被自然排序,最早的在k,第二个在k+1,依此类推,最新的在k-1。(序列在数组末尾换行)
# 4 楼答案 在java中有几种Queue的实现。继承或扭曲现有实现并像这样实现add()方法应该很简单: boolean add(E e) { if(q.size()==MAX_SIZE) { remove(); } q.add(e) }
# 1 楼答案
重写
TreeSet
并为URL
创建一个Proxy
,它还存储访问的时间。 然后创建一个Comparator
或实现Comparable
并覆盖equals
和hashCode
对于重写
TreeSet
this可以帮助您您需要重写
add
方法。因为您可能不需要addAll
,所以可以抛出一个UnsupportedOperationException
在这之后,您应该会很好,您甚至可以做一些事情,比如每次访问时都会存储重访的URL(这意味着指向同一URL的不同代理URL)或每个URL只存储一个条目。这取决于如何定义
equals
(以及相应的hashCode
,分别是compare
) 方法小心:
TreeSet
使用compare
方法进行相等检查,不使用相等方法# 2 楼答案
你需要一个循环缓冲区
只需保留一个大小为N、索引为k的数组b[],它指向最早的URL。每次需要添加新URL时,将其分配给b[k]并增加k,如果需要,将其包装:k=(k+1)%N
所有的URL都会被自然排序,最早的在k,第二个在k+1,依此类推,最新的在k-1。(序列在数组末尾换行)
# 3 楼答案
使用大小为
n
的circular buffer# 4 楼答案
在java中有几种Queue的实现。继承或扭曲现有实现并像这样实现add()方法应该很简单: