gpt4 book ai didi

java - PriorityQueue 的比较如何工作

转载 作者:行者123 更新时间:2023-12-02 09:37:04 24 4
gpt4 key购买 nike

我指的是此博客上列出的代码: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正在构建 Comparator 。值ab是正在比较的两个值。现在

  1. 为什么 a 之间存在差异和b与 0 进行比较?为什么不<>对彼此?
  2. 如果是三元运算,为什么返回值为 keyvalue ?这一点最让我困惑。

最佳答案

(a,b)->b.getValue()-a.getValue() == 0?a.getKey() - b.getKey(): b.getValue() - a.getValue()使用 lambda 定义执行以下操作的比较器:
b.getValue()-a.getValue() == 0?
当调用compareTo时,首先检查是否a.getValue()b.getValue() 相同.
如果相同则返回a.getKey() - b.getKey()
否则,返回b.getValue() - a.getValue()

这对于您的问题意味着什么?让我们来看看。首先,回想一下 Java 的 PriorityQueue 根据给定的 Comparator 充当最小堆;也就是说,第一个被拉出的元素是那个 elem 的元素。 compareTo (other) 对于 PriorityQueue 中的任何其他元素返回 -1 或 0。我们可以使用它来确定哪些元素将是首先从 PriorityQueue 中提取的元素。
这里有几个案例:

  • a.getValue() == b.getValue() :我们评价a.getKey() - b.getKey()
    • a.getKey() == b.getKey()
    • 在本例中,我们返回 0。
    • a.getKey() > b.getKey()
    • 在本例中,我们返回 1。
    • a.getKey() < b.getKey()
    • 在本例中,我们返回 -1。
    • 这个分支就像 getKey() 上的常规比较器,这意味着条形码编号上的比较器
  • 'a.getValue() != b.getValue() : We evaluate b.getValue() - a.getValue()`
    • a.getValue() > b.getValue()
    • 在本例中,我们返回 -1。
    • a.getValue() < b.getValue()
    • 在本例中,我们返回 1。
    • 这个分支就像 getValue() 上的反向比较器,这意味着条码频率的反向比较器

当我们把它们放在一起时,这意味着什么?表达式(a,b)->b.getValue()-a.getValue() == 0?a.getKey() - b.getKey(): b.getValue() - a.getValue()使用 lambda 函数定义比较器,以便将从 PriorityQueue 中删除的元素按照从 最高 最低的顺序提取强>条形码频率。如果任何两个条形码的条形码频率相同相同这些条形码将按照从最低到低的顺序相对于彼此排序 最高 条形码编号。

如果以下“条形码”:“条形码频率”对位于 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。

关于java - PriorityQueue 的比较如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57417659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com