优先级队列未根据Java中的优先级返回正确的值

优先级队列未根据Java中的优先级返回正确的值,java,comparator,priority-queue,Java,Comparator,Priority Queue,我有一个数组,其中我必须从数组中获得最高的k个频繁整数 int[] nums = new int[] {5,3,1,1,1,3,73,1}; int k = 2 我的函数如下所示: static public List<Integer> topKFrequent(int[] nums, int k) { List<Integer> res = new ArrayList<>(); if (nums.length == 0)

我有一个数组,其中我必须从数组中获得最高的k个频繁整数

int[] nums = new int[] {5,3,1,1,1,3,73,1};
int k  = 2
我的函数如下所示:

static public List<Integer> topKFrequent(int[] nums, int k) {
    List<Integer> res = new ArrayList<>();
    if (nums.length == 0)
        return res;
    Map<Integer, Integer> hash = new HashMap<>();
    for (int i : nums) {
        hash.put(i, hash.getOrDefault(i, 0) + 1);
    }

    System.out.println(hash);

    Queue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<> (
            (a, b) -> a.getValue() > b.getValue()? a.getValue():b.getValue()
    );
    for (Map.Entry<Integer, Integer> entry : hash.entrySet()) {
        pq.offer(entry);
    }

    System.out.println(pq);

    System.out.println(pq.poll());
    System.out.println(pq.poll());

//  for (int i=0; i<k; i++)
//      res.add(pq.poll().getKey());

    return res;
}
第二项返回错误,它应该是
3=2
。 有人能告诉我代码有什么问题吗?比较器是否不正确?

您定义的值是错误的。它从不返回负数。 从文档中,
compare
方法应返回:

作为第一个参数的负整数、零或正整数小于、等于或大于第二个参数

您可以使用静态
comparator
方法,而不是滚动自己的比较器(如果您至少使用Java 8):

Queue pq=new PriorityQueue(
Comparator.comparing(Map.Entry::getValue,Comparator.reverseOrder())
);

Queue pq=new PriorityQueue(
(e1,e2)->Integer.compare(e1.getValue(),e2.getValue())
);
您定义的错误。它从不返回负数。 从文档中,
compare
方法应返回:

作为第一个参数的负整数、零或正整数小于、等于或大于第二个参数

您可以使用静态
comparator
方法,而不是滚动自己的比较器(如果您至少使用Java 8):

Queue pq=new PriorityQueue(
Comparator.comparing(Map.Entry::getValue,Comparator.reverseOrder())
);

Queue pq=new PriorityQueue(
(e1,e2)->Integer.compare(e1.getValue(),e2.getValue())
);

问题在于比较器的比较方法。合同比较法

  • 如果小于b,则返回负整数
  • 如果a大于b,则返回正整数
  • 如果a等于b,则返回0
  • 试试下面的代码

    static public List<Integer> topKFrequent(int[] nums, int k) {
        List<Integer> res = new ArrayList<>();
        if (nums.length == 0)
            return res;
        Map<Integer, Integer> hash = new HashMap<>();
        for (int i : nums) {
            hash.put(i, hash.getOrDefault(i, 0) + 1);
        }
    
        System.out.println(hash);
    
    
        Queue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<> (
                (a, b) -> Integer.compare(b.getValue(), a.getValue())
        );
        for (Map.Entry<Integer, Integer> entry : hash.entrySet()) {
            pq.offer(entry);
        }
    
    
        for (int i = 0; i < k; i++) {
            res.add(pq.poll().getKey());
        }
        return res;
    }
    
    静态公共列表topKFrequent(int[]nums,int k){
    List res=new ArrayList();
    如果(nums.length==0)
    返回res;
    Map hash=new HashMap();
    for(int i:nums){
    hash.put(i,hash.getOrDefault(i,0)+1);
    }
    System.out.println(散列);
    队列pq=新优先级队列(
    (a,b)->Integer.compare(b.getValue(),a.getValue())
    );
    for(Map.Entry:hash.entrySet()){
    pq.报价(条目);
    }
    for(int i=0;i
    问题在于比较器的比较方法。合同比较法

  • 如果小于b,则返回负整数
  • 如果a大于b,则返回正整数
  • 如果a等于b,则返回0
  • 试试下面的代码

    static public List<Integer> topKFrequent(int[] nums, int k) {
        List<Integer> res = new ArrayList<>();
        if (nums.length == 0)
            return res;
        Map<Integer, Integer> hash = new HashMap<>();
        for (int i : nums) {
            hash.put(i, hash.getOrDefault(i, 0) + 1);
        }
    
        System.out.println(hash);
    
    
        Queue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<> (
                (a, b) -> Integer.compare(b.getValue(), a.getValue())
        );
        for (Map.Entry<Integer, Integer> entry : hash.entrySet()) {
            pq.offer(entry);
        }
    
    
        for (int i = 0; i < k; i++) {
            res.add(pq.poll().getKey());
        }
        return res;
    }
    
    静态公共列表topKFrequent(int[]nums,int k){
    List res=new ArrayList();
    如果(nums.length==0)
    返回res;
    Map hash=new HashMap();
    for(int i:nums){
    hash.put(i,hash.getOrDefault(i,0)+1);
    }
    System.out.println(散列);
    队列pq=新优先级队列(
    (a,b)->Integer.compare(b.getValue(),a.getValue())
    );
    for(Map.Entry:hash.entrySet()){
    pq.报价(条目);
    }
    for(int i=0;i
    您的密码是错误的。如果第一个参数小于第二个参数,它应该返回一个负数。您的错误。如果第一个参数小于第二个参数,它应该返回一个负数。谢谢,它清除了Java中比较器的理解谢谢,它清除了Java中比较器的理解
    Queue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<> (
            (e1, e2) -> - Integer.compare(e1.getValue(), e2.getValue())
    );
    
    static public List<Integer> topKFrequent(int[] nums, int k) {
        List<Integer> res = new ArrayList<>();
        if (nums.length == 0)
            return res;
        Map<Integer, Integer> hash = new HashMap<>();
        for (int i : nums) {
            hash.put(i, hash.getOrDefault(i, 0) + 1);
        }
    
        System.out.println(hash);
    
    
        Queue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<> (
                (a, b) -> Integer.compare(b.getValue(), a.getValue())
        );
        for (Map.Entry<Integer, Integer> entry : hash.entrySet()) {
            pq.offer(entry);
        }
    
    
        for (int i = 0; i < k; i++) {
            res.add(pq.poll().getKey());
        }
        return res;
    }