【问题标题】:Using a comparator and a separate compareTo method for a PriorityQueue对 PriorityQueue 使用比较器和单独的 compareTo 方法
【发布时间】:2012-11-30 02:57:07
【问题描述】:

如果我有一个由 T 个对象组成的 PriorityQueue,并且 T 有一个 compareTo() 方法并实现了可比较,但我的 PriorityQueue 也将比较器作为参数,那么我的 PriorityQueue 将寻找它的排序元素?

换句话说,哪一个决定了对象的优先级? compareTo() 方法还是提供的比较器?

【问题讨论】:

    标签: java priority-queue comparator compareto


    【解决方案1】:

    构造函数的comparator参数的文档指出

    comparator - 用于对该优先级队列排序的比较器。如果为 null,则顺序取决于元素的自然顺序。

    这意味着当指定comparator 时,compareTo 方法建立的自然顺序将被忽略。

    【讨论】:

      【解决方案2】:

      对于标准 PriorityQueue,如果您使用 Comparator<T> 构造它,那么这将确定优先级。如果不是,那么Comparable<T> 将确定它。这在PriorityQueue API中都有很好的描述

      【讨论】:

      • 感谢您的快速回复!关于它为什么会这样工作的任何见解?这是 Java 大图的一部分吗?
      • @nobillygreen:你为什么会期待一些不同的东西?这种行为对我来说似乎很直观。
      • @nobillygreen:因为这就是它在 API 中的定义方式。
      【解决方案3】:

      我正在阅读PriorityQueue 类的source code for Oracle's implementation,它会检查是否正在使用比较器并首先使用它。否则,它使用 Comparable 对象。

      【讨论】:

        【解决方案4】:

        Comparable 定义集合中类的自然顺序,而 Comparator 允许您提供不同的顺序。如果您决定提供不同的比较器,它将覆盖自然顺序。通过不输入比较器,它将恢复为 compareTo 方法设置的自然顺序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-26
          • 2018-10-13
          • 1970-01-01
          相关资源
          最近更新 更多