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