2011-05-09 71 views
4

如何在Mathematica中使用Java?我有兩個文件,GRASP.nbGRASP.java,在同一個文件夾(順便說一句:GRASP =貪婪隨機自適應搜索程序)。我有兩個文件,GRASP.nbGRASP.java,在同一文件夾(順便說一句:GRASP =貪婪隨機自適應搜索程序)。 GRASP.java文件包含一個方法public static int[] TSP(int[][] g, int numberOfIterations, int k)。我想在Mathematica中調用這個方法。Java和Mathematica交互

我的數學文檔閱讀,也here,我應該寫

Needs["JLink`"]; 
InstallJava[]; 
obj=JavaNew[NotebookDirectory[]~~"GRASP.java"] 

Needs["JLink`"]; 
InstallJava[]; 
obj=LoadJavaClass[NotebookDirectory[]~~"GRASP.java"] 

或類似的東西,但任何事情我嘗試,返回一個錯誤。我有WinXP,Mathematica 7,Eclipse 3.6。

任何工作示例將不勝感激。

回答

7

不要忘記首先編譯Java類 - 不能直接加載GRASP.java

編譯完成後,請嘗試以下操作:

Needs["JLink`"] 
AddToClassPath[NotebookDirectory[]]; 
LoadJavaClass["GRASP"]; 
GRASP`TSP[{{1,2,3},{4,5,6}}, 7, 8] 

由於TSP方法是一個靜態方法,你必須加載Java類本身,然後才能訪問它。請注意,該類成爲名爲GRASP的Mathematica上下文,並且該靜態方法作爲該上下文中的符號(GRASP`TSP,如上所示)進行訪問。

如果你想訪問的方法是常規方法(而不是靜態),則調用順序應該是這樣,而不是:

Needs["JLink`"] 
AddToClassPath[NotebookDirectory[]]; 
obj = JavaNew["GRASP"]; 
[email protected][{{1,2,3},{4,5,6}}, 7, 8] 

所有這一切都假定你的Java類包含在默認包 - 一個不尋常的情況。如果類被包含在一個名爲包,那麼語法會是這樣:

Needs["JLink`"] 
AddToClassPath[NotebookDirectory[]]; 
LoadJavaClass["com.stackoverflow.GRASP"]; 
com`stackoverflow`GRASP`TSP[{{1,2,3},{4,5,6}}, 7, 8] 

Needs["JLink`"] 
AddToClassPath[NotebookDirectory[]]; 
obj = JavaNew["com.stackoverflow.GRASP"]; 
[email protected][{{1,2,3},{4,5,6}}, 7, 8] 

如果該類是在一個名爲包com.stackoverflow在我的例子),然後確保班級具有相對於筆記本的路徑com/stackoverflow/GRASP.class。這是Java的要求,而不是Mathematica。

+0

它就像一個魅力!謝謝,非常感謝。 – Leon 2011-05-09 13:01:27

1

您鏈接到的StackOverflow後顯示的是Java類(GRASP)的名稱,而不是源文件的名稱,作爲參數傳遞,因此絕對丟失.java。此外,您需要編譯源文件以生成GRASP.class文件,因爲這是可以實際加載的格式。這可能是簡單的只是

javac GRASP.java 

但是,它可能是更難取決於什麼是在該文件中。同樣,類的名稱可能不只是GRASP - 如果文件中有package com.foo.something語句,則參數將爲com.foo.something.GRASP