【问题标题】:Comparator not working correctly for Priorityqueue Java对于 Priorityqueue Java,比较器无法正常工作
【发布时间】:2018-10-13 17:27:29
【问题描述】:

我正在向 PriorityQueue 添加边,但由于某种原因,它们没有按其值排序,导致稍后出现错误结果。

我的边缘类看起来像这样

class Edge implements Comparable<Edge>{
int value;
String dest;
String start;

public Edge(String start, String dest, int g) {
    this.dest = dest;
    value = g;
    this.start = start;
}
@Override
public int compareTo(Edge o) {
    int temp = value - o.value;
    if (temp > 0) {
        return 1;
    }
    if (temp < 0) {
        return -1;
    }
    return 0;
}

然而,当我运行我的代码时,我在属于节点“Springfield,MO”的 LinkedList 上执行 addAll 到 PriorityQueue 时,边按错误的顺序排序,如下所示,有什么问题?

queue.addAll(list.get(node));

我尝试为 Edge 创建一个特定的比较器类并将其用作 PriorityQueue 中的参数,但我仍然得到相同的结果。

【问题讨论】:

  • 为什么要做减法?为什么不只是Integer.compare(value, o.value);
  • 鉴于您的比较器定义,我认为它工作得很好......
  • @Neijwiert 你是对的,但是这给出了相同的结果。
  • @HBo 但是,如果它的值较低,为什么在 PriorityQueue 中塞米诺尔不在文森斯之上?
  • 由于您尝试了@Neijwiert 的解决方案但没有成功,我想您应该尝试使用给定的答案

标签: java linked-list comparator priority-queue


【解决方案1】:

PriorityQueue的内部结构是无序的,是一个堆,可以查看this的问题。

当您使用peekpoll方法检索数据时,保证是有序的。

但在迭代队列时要小心:

方法 iterator() 中提供的迭代器不保证 以任何特定顺序遍历优先级队列的元素。 如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())。

【讨论】:

  • 抱歉,您能详细说明一下吗? addAll中的迭代在将元素添加到PriorityQueue时是否不使用比较器?
  • @Slayahh 不,队列的内部结构是无序的。它基于堆。
  • 但这不是意味着每次向队列中添加新元素时都必须调用 sort() 吗?如果不对添加的一个元素进行排序,这是否会降低优先级队列的意义?
  • @Slayahh 可以从队列中一个一个的取出元素,保证得到有序数据。
  • @GilbertS 队列是堆序的,不一定是排序的。例如,内部订单可能是[1,3,2,6,5,4]。这是堆顺序。不过,它显然没有排序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多