2

UDT を定義する何かが必要なので、次のようにします。

(defrecord Foo [a b])

これで、この型のインスタンスを次のように宣言できます

(def f (Foo. 10 20))

しかし、どうすればこれらの Java のような配列を clojure に持つことができるでしょうか。

Add メソッドを繰り返し呼び出して、新しい Foo をリストに追加できるようにnew ArrayList<Foo>()(またはそれに近いもの) が必要です。

それを行う方法を見つけることができないようです。

編集:

私のものをFooのキーにマップするようにclojureに指示する必要があります。だから、私は自分のfoo-dataを調べてから、Foo型のArrayListを作成する方法が必要です

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

dosq でこれらにアクセスできますが、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))

このようなシナリオでは、vector のような 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 に答える