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

Java中的PriorityQueue

陆昕
2023-03-14

当我尝试将多个元素添加到Java类中的PriorityQueue时,会引发以下异常:

java.lang.ClassCastException

添加以下消息“事件不能转换为java.lang.可比

当我尝试将两个Event对象添加到优先级队列时,我会得到这个表达式。这是我如何初始化优先级队列等。也许我的构造中有一个错误,因为这是我第一次使用它:

//the instance field
private PriorityQueue<Event> queue;

//Then in the constructor
queue = new PriorityQueue<Event>();

我只是在main方法中进行测试,但当我得到上述错误时:

public static void main(String[] args) {
    SimEngine engine = new SimEngine();
    Event event1 = new Event();
    Event event2 = new Event();

    engine.getQueue().offer(event1);
    engine.getQueue().offer(event2);

    System.out.println("Queue size" + engine.queue.size());

}

注意:我尝试在尝试添加到队列时同时调用add和offer。我得到了相同的错误。

以上所有代码都在我的SimEngine类中。我知道队列需要知道如何对这些元素进行排序,但我认为如果不指定任何优先级,那么它只会自然地对它们进行排序?有人能告诉我我做错了什么吗?谢谢。

共有2个答案

林德华
2023-03-14

PriorityQueue是已排序的集合。因此,添加到它们中的元素必须相互比较。

要么它们必须实现可比较(队列使用compareTo方法所暗示的自然顺序对它们进行排序),要么在创建队列本身时必须提供一个比较器(队列将使用该比较器对对象进行比较和排序)。

如果不执行这些操作,队列将无法确定第一个元素的优先级是否高于第二个元素。

钮善
2023-03-14

事件需要执行可比较的

另一个选项是传递比较器

 类似资料:
  • 问题内容: 我的问题可能太广泛了,答案可能是简单的“否”,但我不得不问。 Java 7中有(Java 8)流 *的等效实现吗? 我熟悉(Java 8)流,但是我的项目要求是使用Java 7。 *不要与inputStream和outputStream混淆。 问题答案: 在官方API中,没有。 Java 7没有更多的公共更新。如果您是客户,您可能仍然会获得较小的更新,但是对于反向移植Stream AP

  • 问题内容: 我正在寻找Java中的KeyValuePair类。 由于java.util大量使用接口,因此没有提供具体的实现,只有Map.Entry接口。 我可以导入一些规范的实现吗?这是我讨厌实现100倍的“管道工编程”类之一。 问题答案: 类AbstractMap.SimpleEntry是通用的,并且可能有用。

  • 问题内容: 我已经问过类似的问题,但是这次我将更具体。 我需要在一个循环中执行通常较大的正定对称矩阵(约)的Cholesky分解。现在,为此,我一直尝试: 1)Apache数学库 2)平行柯尔特库 3)JLapack库 在上述三种情况中的任何一种情况下,例如与MATLAB相比,时间消耗都非常长。 因此,我想知道Java中是否存在用于Cholesky分解的高度优化的外部工具:例如,我一直在思考CHO

  • 问题内容: Java 的用途是什么?有什么好处?它是如何工作的?示例代码也将很有用。 问题答案: 关键是要提供线程安全的实现。多个线程可以对其进行读写,而没有机会接收到过时或损坏的数据。 提供自己的同步,因此您不必显式同步对其的访问。 的另一个功能是它提供了该方法,如果指定的键不存在,它将 自动 添加一个映射。考虑以下代码: 此代码不是线程安全的,因为另一个线程可以在到和的调用之间添加映射。正确的

  • 问题内容: 在Java中调用R功能的最佳方法是什么? 我正在寻找一种使用我的Java应用程序在R中制作标准2d散点图和直方图的快速,简便和可靠的方法。我想知道快速Google搜索中出现的哪些程序包/界面最方便使用。 我期待您的建议! 问题答案: 使用JRI:http ://www.rforge.net/JRI/ 。它与rJava捆绑在一起,包括一些用法示例。 一个非常简单的示例如下:

  • 问题内容: 我正在尝试在Java中实现以下代码: 通过使用以下之一: 我浏览了许多SO的示例和问题,但没有找到正确生成iv []的方法(与C中的值相同)。似乎没有办法做到这一点,因为java允许仅以随机(而不是C语言中可用的伪随机)创建此值。这是正确的吗?有人可以帮忙解决这个问题吗? 问题答案: 收到crypt专家的提示,找到了正确的解决方案: