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

Priorityqueue Java的比较器工作不正常

文德曜
2023-03-14

我正在将边添加到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中将所有内容添加到PriorityQueue时,边按错误的顺序排序,如下图所示,问题是什么?

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

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

共有1个答案

堵存
2023-03-14

PriorityQueue的内部结构没有排序,它是一个堆,您可以检查这个问题。

当您使用方法peek轮询检索数据时,它被保证是有序的。

但迭代队列时要小心:

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

 类似资料:
  • 我开发了一个程序,它创建一个书籍对象数组,并根据用户输入对它们进行排序。排序选项是author-title-pages-price,除了price排序之外,其他都可以。请帮我找出为什么我不能使用比较器对双打进行排序...我的课本课: 和排序程序:

  • 看看这段代码: 输出为,这意味着相同的方法并不是每次都返回相同的值,即使所有参数都是静态的? 这是怎么回事?我需要这个方法,用于我的程序,它将比较两个对象的体积,但这是不可能的?我敲打我的头这么长时间,想弄清楚是什么原因造成的问题,幸运的是我找到了,但现在我不明白为什么??是与编译器(GCC)有关,还是我在这里遗漏了一些重要的东西?

  • 我有一个客户对象类,它有一些变量,并且已经实现了一个关于其中一个变量的比较器。然而,我需要为不同的变量last_name实现另一个比较器。 因为我的Customer类中不能有2个compareTo()方法,所以我决定在这里专门创建一个Comparing类 但一旦触及Collections.sort(客户); 它不会激活下面的公共int比较(Customer Customer_1,Customerc

  • 问题内容: 我的代码: 引用的日志文件是: 然后,需要检查脚本中的下一个条件是: 如果条件不起作用 问题答案: 必要的修复: 此后已在问题中解决。 可能必要的修复: 如注释中所述,在脚本中使用尾随空格表示将尾随空格存储在其中,这将破坏与的比较。

  • 问题内容: 我正在尝试使用比较器来帮助对对象列表进行排序。在以下示例中,我对比较器的工作原理以及确切的工作方式有疑问: 从上面可以看到,有必要根据方法返回的整数排名对学生进行比较和排序。顾名思义,这是一项繁重的操作。以上方法会是最有效的吗?或者基本上遍历我要排序的列表中的每个学生,执行每个学生,然后将结果存储在Student对象的字段中会更好。然后,比较器将执行以下操作: 这两种方法是否具有可比性

  • 我正在尝试使用比较器来帮助排序对象列表。我有一个问题,关于比较器到底是如何工作的,以及它在下面的示例中到底会做什么: 如上面所示,需要根据方法返回的整数等级对学生进行比较和排序。顾名思义,这是一项繁重的操作。上述方法是否最有效?或者更好的做法是遍历我试图排序的列表中的每个学生,对每个学生执行,并将结果存储在student对象的字段中。然后,比较器将执行以下操作: 编辑:让我们假设,为了它,不可能添