我在MatLab中需要一个最小堆,并且我正在尝试使用Java的PriorityQueue。我被困在如何供应比较器的问题上。到目前为止,我已经初始化了PriorityQueue,并且可以向其添加一个值索引对:
>> q = java.util.PriorityQueue
q =
[]
>> q.add({1,3})
ans =
1
当我尝试添加更多数据时出现问题:
>> q.add({2,4})
??? Java exception occurred:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.Comparable
at java.util.PriorityQueue.siftUpComparable(Unknown Source)
at java.util.PriorityQueue.siftUp(Unknown Source)
at java.util.PriorityQueue.offer(Unknown Source)
at java.util.PriorityQueue.add(Unknown Source)
从this post中,我看到我需要提供一个比较器函数,但我不知道如何做到这一点。
3条答案
按热度按时间k2arahey1#
优先级队列需要包含实现可比较的对象,或者需要在构造时传入比较器函数。
目前在MatLab中没有一种方法既不能用MatLab代码实现Java接口,也不能提供文字上的Java代码。
因此,您必须遵循@nibot的建议,创建一个包含实现比较器的类的小.jar文件。
1tu0hz3e2#
假设您可以使用非负浮点值和整数索引,以下是部分答案。我们的想法是将这对对象串在一起,并将其用作Java队列中的可比对象。
在一个快速而肮脏的测试中,推入并弹出10000个随机浮点数需要0.5秒,而推入然后弹出10000个(随机浮点数,索引)对需要0.75秒。头顶上有,但也许不是凶手。
c6ubokkw3#