2

我想有一些东西来定义我的 UDT 所以以下

(defrecord Foo [a b])

现在我可以将这种类型的实例声明为

(def f (Foo. 10 20))

但是我如何在clojure中有一个类似java的数组。

我想拥有new ArrayList<Foo>()(或接近的东西),这样我就可以反复调用 Add 方法来将新的 Foo 添加到列表中。

似乎找不到办法做到这一点。

编辑:

我需要告诉 clojure 将我的东西映射到 Foo 的键。所以,我需要一种方法来说明我的 foo 数据,然后用它制作一个 Foo 类型的 ArrayList

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

我可以通过doseq 访问这些,但是我需要创建一个ArrayList,然后使用它来进行一些操作。

4

3 回答 3

6

我建议使用自动创建构造函数的内置 Clojure 功能:

 (defrecord Foo [a b])

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

然后您可以使用标准的 Clojure 高阶函数来构造Foo您喜欢的任何 s 集合,例如

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

(into [] (map (partial apply ->Foo) foo-data))
=> (A vector of Foos with the provided data)
于 2012-07-19T09:06:22.193 回答
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
于 2012-07-19T06:11:36.853 回答
1

如果您不需要立即将 ArrayList 传递回强类型,最好在 Clojure 中操作您的数据结构。我发现http://clojure.org/cheatsheet的“Seq In, Seq Out”部分是一个方便的参考。如果您喜欢通过示例学习,http ://www.4clojure.com 非常适合学习数据结构转换。

于 2012-07-19T11:57:38.230 回答