当前位置: 首页 > 知识库问答 >
问题:

比较如何为PriorityQueue工作

盖和洽
2023-03-14

我指的是这个博客上列出的代码:https://strstr.io/Leetcode1054-Distant-Barcodes/

我在这里复制这段代码

class Solution {
    public int[] rearrangeBarcodes(int[] barcodes) {
        if(barcodes == null || barcodes.length == 0)
            return new int[0];
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for(int i: barcodes)
            map.put(i, map.getOrDefault(i, 0) + 1);
        PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<Map.Entry<Integer, Integer>>(
        (a,b)->b.getValue()-a.getValue() == 0?a.getKey() - b.getKey(): b.getValue() - a.getValue());
        for(Map.Entry<Integer, Integer> entry:map.entrySet())
            pq.offer(entry);
        int[] res = new int[barcodes.length];
        int i = 0;
        while(!pq.isEmpty()) {
            int k = 2;
            List<Map.Entry> tempList = new ArrayList<Map.Entry>();
            while(k > 0 && !pq.isEmpty()) {
                Map.Entry<Integer, Integer> head = pq.poll();
                head.setValue(head.getValue() - 1);
                res[i++] = head.getKey();
                tempList.add(head);
                k--;
            }
            for(Map.Entry<Integer, Integer> e: tempList) {
                if(e.getValue() > 0) 
                    pq.add(e);
            }
            if(pq.isEmpty())
                break;
        }
        return res;
    }
}

我试图理解的代码在这里

PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<Map.Entry<Integer, Integer>>(
        (a,b)->b.getValue()-a.getValue() == 0?a.getKey() - b.getKey(): b.getValue() - a.getValue());

我从这段代码中得到的是PriorityQueue是用比较器构建的。值ab是正在比较的两个值。现在

  1. 为什么ab之间的差异被比作0?为什么不

共有1个答案

鲜于俊侠
2023-03-14

〈守则〉(a, b)─

这在你的问题中意味着什么?让我们看看。首先,回想一下Java的PriorityQueue作为一个min-heap,根据它被给定的比较器;也就是说,拉出的第一个元素是这样的,elem.compareTo(其他)为PriorityQueue中的任何其他元素返回-1或0。我们可以使用它来确定哪些元素将是第一个从PriorityQueue中提取的元素。
这里有一些情况:

  • a.getValue()==b.getValue():我们评估a.getKey()-b.getKey()
    • a.getKey()==b.getKey()
    • 在这种情况下,我们返回0。
    • a.get键
    • a.getValue()

    当我们把这一切放在一起,这一切意味着什么?表达式(a, b)-

    如果以下“条形码”:“条形码频率”对位于PriorityQueue内

    1:2
    2:4
    3:2
    4:1

    它们将按以下顺序提取:

    2:4, 1:2, 3:2, 4:1

    此外,为了澄清为什么他们将ab与0进行比较,他们没有。相反,他们正在比较b.getValue()-a.getValue()==0。将a.getValue()添加到方程的两侧,我们得到b.getValue()==a.getValue()。本质上,他们是在测试这些值是否相等,而不是这些值是否为0。

 类似资料:
  • 我正在将边添加到PriorityQueue,但由于某些原因,它们没有按其值进行排序,从而导致以后出现错误的结果。 我的边缘班是这样的 然而,当我运行我的代码,在属于节点“Springfield,MO”的LinkedList中将所有内容添加到PriorityQueue时,边按错误的顺序排序,如下图所示,问题是什么? 我尝试为Edge创建一个特定的比较器类,并将其用作PriorityQueue中的参数

  • 我试图解决以下leetcode问题: 给定一个排序数组,两个整数k和x,查找数组中与x最近的k个元素。结果也应该按升序排序。如果有一个领带,较小的元素总是首选。 示例1:输入:[1,2,3,4,5],k=4,x=3 产出:[1,2,3,4] 示例2:输入:[1,2,3,4,5],k=4,x=-1 产出:[1,2,3,4] 目前我的错误解决方案如下: 问题在于我传递给构造函数的比较器。其思想是,我希

  • 在我的PriorityQueue中,我有两种类型的客户,即VIP和常规客户。我想先为贵宾服务,再为常客服务。 如果CustomerID<100,则视为VIP。 如果客户是VIP,他会排在队列中VIP部分的最后 更新:我不想排序任何其他列除了VIP。我不想添加“日期”,因为它感觉像是一个黑客,而不是理解Java是如何工作的。

  • 我尝试用降序的内部比较器类实现优先级队列,但是当我打印优先级队列时,我没有得到正确的结果。当我尝试收集相同的比较器代码时。排序以实现列表的排序(使用相同的值)。我得到了正确的结果。你能解释一下吗? 上述代码的答案是pq值为[50,40,20,10,30] 以上代码的答案是数组值为:[50,40,30,20,10]

  • 在React的这篇文档中,据说 shallowCompare对current props和nextProps对象以及current state和nextState对象执行浅层相等性检查。 我无法理解的是,如果它简单地比较了对象,那么componentupdate方法应该总是返回true,就像 如果我们没有改变状态,那么比较将始终返回false,因此shouldComponent更新将始终返回tru

  • 问题内容: 我一直在阅读编程书,作者展示了一个类似的示例: 所以,我想知道为什么为什么等于假?如何比较这两个元组? 顺便说一句,这本书没有解释。 问题答案: 比较元组的位置:将第一元组的第一项与第二元组的第一项进行比较;如果它们不相等(即第一个大于或小于第二个),则这是比较的结果,否则将考虑第二个,然后是第三个,依此类推。 请参阅常见序列操作: 相同类型的序列也支持比较。特别是,通过比较相应的元素