如何从用户定义类型的优先级队列中删除对象

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 在内部使用它来查找要删除的对象。

即这是来自 PriorityQueueindexOf(...) 代码,它调用了 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 中的任何属性根据您的需要,这里有 keyfreq

        @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;
        }