如何从用户定义类型的优先级队列中删除对象
How to remove an object from priority queue of user defined type
我的优先队列定义为
PriorityQueue< LRUCache > qu = new PriorityQueue<>(new Comp() );
此处 LRUCache class 具有变量键和频率,我基于它们创建了比较器。
如果我必须根据特定键和频率从优先级队列中删除特定对象
我该怎么做
qu.remove(new LRUCache(key , freq ) ) // like this or something better ??
是的,您可以,但首先,LRUCache
class 中的 equals()
方法,因为 PriorityQueue
在内部使用它来查找要删除的对象。
即这是来自 PriorityQueue
的 indexOf(...)
代码,它调用了 remove(...)
方法
private int indexOf(Object o) {
if (o != null) {
final Object[] es = queue;
for (int i = 0, n = size; i < n; i++)
if (o.equals(es[i]))
return i;
}
return -1;
}
,只需将 LRUCache
class 添加到 equals()
equals(...)
方法将检查以下内容:
1- 使用this关键字检查obj参数是否等于当前对象然后return true
2-检查obj参数是否为null或不相同class “无效状态” then return false
3- 否则 obj 参数将有效且类型相同,因此转换为此处 LRUCache
的目标 class,并检查 class 中的任何属性根据您的需要,这里有 key
和 freq
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || obj.getClass() != this.getClass())
return false;
LRUCache cache = (LRUCache) obj;
return key.equals(cache.key) && freq == cache.freq;
}
我的优先队列定义为
PriorityQueue< LRUCache > qu = new PriorityQueue<>(new Comp() );
此处 LRUCache class 具有变量键和频率,我基于它们创建了比较器。 如果我必须根据特定键和频率从优先级队列中删除特定对象 我该怎么做
qu.remove(new LRUCache(key , freq ) ) // like this or something better ??
是的,您可以,但首先,LRUCache
class 中的 equals()
方法,因为 PriorityQueue
在内部使用它来查找要删除的对象。
即这是来自 PriorityQueue
的 indexOf(...)
代码,它调用了 remove(...)
方法
private int indexOf(Object o) {
if (o != null) {
final Object[] es = queue;
for (int i = 0, n = size; i < n; i++)
if (o.equals(es[i]))
return i;
}
return -1;
}
,只需将 LRUCache
class 添加到 equals()
equals(...)
方法将检查以下内容:
1- 使用this关键字检查obj参数是否等于当前对象然后return true
2-检查obj参数是否为null或不相同class “无效状态” then return false
3- 否则 obj 参数将有效且类型相同,因此转换为此处 LRUCache
的目标 class,并检查 class 中的任何属性根据您的需要,这里有 key
和 freq
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || obj.getClass() != this.getClass())
return false;
LRUCache cache = (LRUCache) obj;
return key.equals(cache.key) && freq == cache.freq;
}