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

Java:比较器总是返回1不会将优先级队列放入队列中?[复制]

权浩阔
2023-03-14

可能重复:
Java:从优先级队列生成奇怪的队列顺序

我尝试通过实现以下比较器将优先级队列转换为队列:

  • 哈克:队列比较器使优先级队列的行为像队列(FIFO)总是返回1
  • 由于优先级队列的自然排序在头部有最少的元素,并且当第一个元素小于第二个元素时,传统比较器返回-1,因此被黑客攻击的比较器总是返回1,以便当前(最后)的平方将被放置在尾部(递归)

以下是代码:

import java.util.Comparator;
public class QueueComparator implements Comparator<Square>{
    public int compare(Square square1, Square square2)
    {
        return 1;
    }
}

但由此产生的“队列”并不能使事情保持有序(FIFO)。为什么?

共有3个答案

易宣
2023-03-14

compareTo(a,b)通常应该返回——compare(b,a),而compareTo(a,a)应该返回零。你的比较器违反了这两条规则。

查看Javadoc。

利海阳
2023-03-14

嗯,这是一个黑客。所以如果它不起作用,我不会太惊讶。

PriorityQueue的Javadoc表示:

这个队列的头是相对于指定排序的最小元素。如果多个元素以最小值绑定,头就是其中一个元素——绑定被任意断开。

好了,给你。如果您的比较器为所有元素对返回相同的值,那么您只有联系。因此,队列顺序确实是任意的。

洪璞瑜
2023-03-14

问题是为什么要这样做?

首先,您的比较器完全损坏,因为它违反了基本约束

sign(compare(a,b)) = - sign(compare(b,a))

compare(a,a) == 0

所以任何使用它的东西都可能会产生各种各样的结果,比如丢失条目,在无休止的循环中运行,抛出堆栈溢出。。。

如果您想实现一个IDontGiveAShitCompator,它应该始终返回0。一切取决于一个比较器应该能够处理。

订单结果如何仍取决于实施情况。如果它在一个列表中存储元素,FIFO或LIFO是可能的,如果它存储在一个平衡的树中,它可能会始终在一侧添加元素,导致树的重新平衡,这几乎会混淆所有内容。

也许它使用基于哈希的东西,在这种情况下,具有相同优先级的所有元素可能会按其哈希值排序。

 类似资料:
  • 假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?

  • 有人能解释一下这里使用的比较运算符的语法吗?它是做什么的

  • priority_queue,comparator(query,d)>min_heap; main.cpp:20:7:注意:“comparator”不是文字,因为: class comparator{ main.cpp:20:7:注意:“comparator”不是聚合,没有普通的默认构造函数,也没有不是复制或移动构造函数的constexpr构造函数 Main.cpp:92:65:注意:应为类型,但

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我在Java使用PriorityQueue。 我有一个结构如下的对象: 优先考虑的是从最便宜到最贵的成本: 我使用add将对象包含在队列中。 它适用于队列中的每个元素,但我添加的最后一个元素总是位于底部。 我做错了什么?

  • 问题内容: 在Python文档中, 最低值的条目首先被检索(最低值的条目是由返回的条目)。条目的典型模式是形式为的元组。 看来队列将按优先级排序,然后按数据排序,这可能并不总是正确的。假设数据“项目2”在“项目1”之前入队,则项目1仍将排在第一位。在另一个文档页面heapq中,它建议使用计数器。所以我将数据存储为。是否没有类似的东西 那我就不需要自己执行订购吗? 问题答案: 据我所知,您要找的东西