【问题标题】:Using Java PriorityQueue in Matlab在 Matlab 中使用 Java PriorityQueue
【发布时间】:2011-03-28 03:30:39
【问题描述】:

我在 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 的帖子中,我看到我需要提供一个 Comparator 函数,但我不知道该怎么做。

【问题讨论】:

  • 我怀疑你必须用Java编写比较器函数并单独编译。
  • 是的,看起来就是这样做的。我对 Java 不是很流利,所以我一直在寻找其他解决方案,并在文件交换 (mathworks.com/matlabcentral/fileexchange/…) 上找到了一个符合我需要的条目,尽管如果尝试从空队列中推送某些内容,它会相当不优雅地崩溃。

标签: java matlab priority-queue


【解决方案1】:

优先级队列需要包含实现 Comparable 的对象,或者需要在构造时传入 Comparator 函数。

目前在 MATLAB 中没有一种方法可以使用 MATLAB 代码实现 Java 接口,或者提供文字 Java 代码。

因此,您必须遵循 @nibot 的建议并制作一个包含实现 Comparator 的类的小 .jar 文件。

【讨论】:

    【解决方案2】:
    import java.util.*;
    
    q = java.util.PriorityQueue();
    for i=1:10
    q.add(i);
    end
    disp(q)
    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
    

    【讨论】:

    • 虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案没有用处。
    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多