【问题标题】:How to remove an object from priority queue of user defined type如何从用户定义类型的优先级队列中删除对象
【发布时间】:2020-05-04 15:54:20
【问题描述】:

我的优先级队列定义为

PriorityQueue< LRUCache > qu = new PriorityQueue<>(new Comp() );

这里的 LRUCache 类有变量 key 和 freq,我基于它创建了 Comparator。 如果我必须根据某些键和频率从优先级队列中删除特定对象 我该怎么做呢

qu.remove(new LRUCache(key , freq ) ) // like this or something better ??

【问题讨论】:

    标签: java dictionary queue heap priority-queue


    【解决方案1】:

    是的,您可以,但首先是 LRUCache 类中的 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;
        }
    

    ,只需将equals() 添加到您的LRUCache 类中即可

    equals(...) 方法将检查以下内容:

    1- 使用this关键字检查obj参数是否等于当前对象然后返回true

    2-检查obj参数是否等于null或者不是同一个类“无效状态”然后返回false

    3- 否则 obj 参数将有效且类型相同,因此将其转换为目标类,此处为 LRUCache,并根据您的需要检查类中的任何属性,此处为 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;
            }
    

    【讨论】:

    • 你能解释一下覆盖 equals() 部分吗?
    • @Sophie 我已经用更多细节更新了答案,你可以检查一下。如果需要更多详细信息,请发表评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多