2011-03-28 26 views
3

我需要在Matlab中分鐘堆,我試圖使用Java的PriorityQueue。我被困在如何提供比較器。 到目前爲止,我已經初始化時Queue和可以添加一個價值指數對吧:在Matlab中使用Java的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後,我見我需要提供一個比較器功能,但我不知道如何做到這一點。

+0

我懷疑你必須在Java中編寫比較函數並分別進行編譯。 – nibot 2011-03-28 04:43:57

+0

是的,它看起來就是這樣做的方式。我並不是那麼流利的Java,所以我尋找其他解決方案,並在文件交換中找到了一個條目(http://www.mathworks.com/matlabcentral/fileexchange/24238-priority-queue-mexc)我需要,儘管如果嘗試從空隊列中推送某些東西,它會非常不合時宜地崩潰。 – MatlabSorter 2011-03-28 19:34:49

回答

0

優先級隊列需要包含實現Comparable的對象,或者您需要在構造時傳入Comparator函數。

目前在MATLAB中沒有一種方法可以用MATLAB代碼實現Java接口,也可以提供文字Java代碼。

所以你必須遵循@ nibot的建議,並創建一個包含實現Comparator的類的小型.jar文件。

0
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] 
+1

雖然這段代碼可能會回答這個問題,但最好包含一些上下文,解釋它的工作原理以及何時使用它。從長遠來看,僅有代碼的答案是沒有用的。 – davejal 2015-12-06 02:56:00