Java lambda表达式?如何解释?[duplicate]

dl5txlt9  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(147)

此问题在此处已有答案

Understanding Java's List.sort() with a comparator [duplicate](3个答案)
上个月关闭。

class Solution {
    public int[] topKFrequent(int[] nums, int k) {

        if (k == nums.length) {
            return nums;
        }
 
        Map<Integer, Integer> count = new HashMap();
        for (int n: nums) {
          count.put(n, count.getOrDefault(n, 0) + 1);
        }

        Queue<Integer> heap = new PriorityQueue<>(
        (n1, n2) -> count.get(n1) - count.get(n2));

        for (int n: count.keySet()) {
          heap.add(n);
          if (heap.size() > k) heap.poll();    
        }

        int[] top = new int[k];
        for(int i = k - 1; i >= 0; --i) {
            top[i] = heap.poll();
        }
        return top;
    }
}

因此这是对LeetCode问题之一答案,以找到前k个频繁元素。
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
如果不是用于缩短版本,如何编写(n1,n2)-〉count. get(n1)- count.get(n2)?

5n0oy7gb

5n0oy7gb1#

您使用的是PriorityQueue构造函数,它将一个Comparator作为参数,目的是按如下方式确定优先级:如果它具有较小的“计数”值,则它应该在队列中较早出现(优先级较高)。
我猜在旧java中你可以这样做:

Queue<Integer> heap = new PriorityQueue<>(new Comparator<Integer>() {
  public int compare(Integer n1, Integer n2) {
    return count.get(n1) - count.get(n2);
  }
});

返回值的解释如下:如果为负数,则意味着n1n2之前。如果为正数,则n10之后。如果0,则它们相等或至少相对而言处于同一“级别”。传递哪个负数并不重要。a - b是“如果a较小,则a在b之前”的一种俗气的表达方式。如果你有很大的数字,这可能是危险的--大概这在这里不适用。
更好的写法应该是:

new PriorityQueue<>(Comparator.comparingInt(count::get));

这更清楚地说明了您要尝试 * 做 * 的事情,也就是,对调用count.get()的结果进行优先级排序,将队列中的内容作为参数传递。

相关问题