2012-07-19 47 views
2

我想擁有的東西來定義我的UDT所以下面如何在clojure中定義類型列表?

(defrecord Foo [a b]) 

現在我可以聲明此類型的實例作爲

(def f (Foo. 10 20)) 

但我怎麼都喜歡在這些陣列一個java Clojure的。

我想擁有new ArrayList<Foo>()(或關閉),以便我可以重複調用Add方法以將新的Foo添加到列表中。

似乎無法找到一種方法來做到這一點。

編輯:

我要告訴Clojure的到我的東西映射到富的鑰匙。所以,我需要一種方法來說通過我的富數據,然後作出一個ArrayList出來的Foo類型的

(defrecord Foo [a b c]) 
(def foo-data 
    [ "foo1" 1 8 
    "foo2" 2 7 
    "foo3" 3 6 
    "foo4" 4 5]) 

我可以通過doseq訪問這些後來我需要做一個ArrayList和然後使用 來做一些操作。

回答

6

我建議使用內置的Clojure的功能,它會自動創建一個構造函數:

(defrecord Foo [a b]) 

(->Foo 1 2) ;; auto-generated constructor 
=> #user.Foo{:a 1, :b 2} 

然後你可以使用標準的Clojure高階函數構造不管你喜歡的Foo是什麼,例如

(def foo-data [["Bob" 2] 
       ["Fred" 4] 
       ["Len" 6]]) 

(into [] (map (partial apply ->Foo) foo-data)) 
=> (A vector of Foos with the provided data) 
3

這將是簡單:

user=> (import 'java.util.ArrayList) 
user=> (def data (ArrayList.)) 
#'user/data 
user=> (.add data (Foo. 10 20)) 

我會建議使用Clojure的數據結構,像這樣的場景載體。

向量例如:

user=> (def data (atom [])) 
#'user/data 
user=> (swap! data conj (Foo. 10 20)) ;Add item to data vector 
+0

(def data(ArrayList。)),這是聲明一個新的ArrayList實例,然後你調用數據的add方法?在這種情況下,我將如何使用矢量?任何例子? – 2012-07-19 06:27:02

+0

是的。添加了向量示例 – Ankur 2012-07-19 06:42:17

+0

因此,當我這樣做(.get數據0)時,如何告訴編譯器我正在獲取foo類型?所以我必須做鑄造,我們是否也有clojure的泛型? – 2012-07-19 06:53:09

1

如果您不需要將ArrayList傳遞迴直接強類型的東西,最好在Clojure中操作您的數據結構。我找到了「Seq In,Seq Out」部分http://clojure.org/cheatsheet一個方便的參考。如果您更願意通過示例學習,http://www.4clojure.com對於學習數據結構轉換非常有用。

相關問題