私はベクターが必要なときに怠惰なリストを使用していることがよくあり、逆もまた同様です。また、マップのセットが本当に必要なときに、マップのベクターを持っていることがあります。これらのタイプ間で変換するのに役立つヘルパー関数はありますか?
私はベクターが必要なときに怠惰なリストを使用していることがよくあり、逆もまた同様です。また、マップのセットが本当に必要なときに、マップのベクターを持っていることがあります。これらのタイプ間で変換するのに役立つヘルパー関数はありますか?
回答:
trusty old into
では、何でもseq
できるもの(リスト、ベクター、マップ、セット、ソートマップ)と、必要な空のコンテナーを取得して配置できることを忘れないでくださいinto
。
(into [] '(1 2 3 4)) ==> [1 2 3 4] "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4} "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2} "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"
into
は、ラッパーですconj
。これは、コレクションのタイプに基づいて新しいエントリをコレクションに適切に挿入するための基本的な抽象化です。このフローを非常に美しくする原則は、Clojureが構成可能な抽象化に基づいて構築されていることです。この場合into
はconj
、コレクションの上に追加されseq
ます。
上記の例は、実行時に受信者が渡された場合でも適切に構成されます。基礎となる抽象(seq
およびconj
)がすべてのコレクション(およびJavaのコレクションの多くも)に実装されているため、上位の抽象は心配する必要はありません。多くの特別なデータ関連のコーナーケースについて。
into
uses conj
、doing (into '() some-seq)
はsome-seqの逆のリストを生成するため、conj
コンストレイントを使用するため、注目に値します。
into
他のほとんどの変換手段よりも優れたパフォーマンス特性を得るために、トランジェント(ほとんどのseqタイプ)を利用していることは注目に値します。
vec
、set
そして一般的にinto
はあなたの友達で、別のコレクション型に簡単に「変換」することができます。
マップのベクトルをマップのマップにどのように変換しますか?キーが必要ですが、サンプル入力/期待される出力を使用できますか?
ベクトルにはvec
関数があります
user=> (vec '(1 2 3))
[1 2 3]
レイジーシーケンスにはlazy-seq
関数があります
user=> (lazy-seq [1 2 3])
(1 2 3)
セットに変換するためのset
関数があります
user=> (set [{:a :b, :c :d} {:a :b} {:a :b}])
#{{:a :b} {:a :b, :c :d}}
lazy-seq
のseq
ではなく、非遅延呼び出しがある場合。本当にあなたが前の空のコレクションでさえnil以外のものを返したいなら、がありますsequence
。lazy-seq
やや低レベルの構成です。
ベクトルをリストに変換するにはfor
、次のようにを使用することもできます。
=> (for [i [1 2 3 4]] i)
(1 2 3 4)
データを操作したくない場合seq
は、ベクターで使用します。
=> (seq [1 2 3])
(1 2 3)
for
あなたの代わりにただ行うことができます(map identity [1 2 3 4])
ベクトルをリストに変換する必要はありません。Clojureは、シーケンスが必要な場合に、リストをシーケンスとして扱うようにベクトルを扱います。例えば、
user=> (cons 0 [1 2 3])
(0 1 2 3)
ベクトルがシーケンスとして扱われていることを確認する必要がある場合は、次のようにラップしseq
ます。
user=> (conj [1 2 3] 0) ; treated as a vector
[1 2 3 0]
user=> (conj (seq [1 2 3]) 0) ; treated as a sequence
(0 1 2 3)
マップのベクトルがあり、マップのセットが必要な場合、ベクトルがマップを保持しているかどうかは関係ありません。いつものようにベクトルをセットに変換するだけです:
user=> (set [{:a 1, :b 2} {"three" 3, "four" 4}])
#{{:a 1, :b 2} {"four" 4, "three" 3}}