印刷された戻り値は次のようになりますように、私は(すべてのベクトルに包まれた)シーケンス、番号と私の関数からハッシュマップを返す必要があります:私の入力が大きくなる可能性があるのでclojureハッシュマップの怠惰は理にかなっていますか?
[ ([:c :a] [:e :c] [:f :e] [:d :e] [:g :f] [:b :a]) 15
{:g :c, :f :a, :c :e, :d :a, :b :a, :c :a} ]
、私は、関数からレイジーシーケンス/オブジェクトを返すようにしたいと思います。 ペアのシーケンス(戻りベクトルの最初のオブジェクト)は、それを構築するconj呼び出しの周りに 'lazy-seq'をラップすることによって怠惰にするのは簡単でした。
ハッシュマップ(戻りベクトルの3番目のオブジェクトで、おそらくは自分のシーケンスのように非常に大きい)は、シーケンスと同じループ - 再帰ブロック内に組み立てられています(assoc呼び出しを使用)。ハッシュマップは、私の呼び出し側の一部が使用する追加情報ですが、ペアシーケンスが怠け者として返された場合、潜在的に巨大なハッシュマップを(効率的な)lazy-seqで返すのが理にかなっているのだろうかと思います私はそれをオプションの戻り値にしても。ハッシュマップ内のエントリは、レイジーシーケンス内のペアに関連しています。
これは私のnoobie質問です:大規模なHashMapの代わりにMapEntry'sの遅延シーケンスを返信する意味はありますか?つまり、ユーザーがMapEntrysの遅延セグを取得すると仮定した場合、それらをハッシュマップに変換してルックアップを実行し、次のチャンクなどを取ることになります。これは連想データを遅延して使用する賢明な方法ですか? Clojureで大きな関連データを返す/管理するための慣用的な方法はありますか? 私の選択肢が何であるかについては、何か考えていただければ幸いです。あなたの助けを前にありがとう。彼らに怠惰なマップを与え、ノー
あなたのアイデアをお寄せいただきありがとうございます。キーと値はどちらも安価です(両方ともキーワードです)。ちょうどそれらの多数があるかもしれない。返されるハッシュマップには、本質的に一方から他方へのポインタが含まれます。私はあなたの考え方に興味を持っています。 loop-recurブロックで累進的に構築されているMapの遅延をどうやって構築できるか詳しく教えてください。 あなたはこれを意味しますか: '(loop [my-map {} my-pairs [] ...] ... (recur(遅延assoc my-map kv))))' – Don
あなた(または少なくとも私はあなたがすべきことを示唆していなかった)遅れて地図を徐々に構築することはできません。地図全体の建物を遅らせるだけです。強制すると地図全体が表示されます。 '(delay(loop [my-map {})(if(...)(recur ...)my-map)))'となります。 – amalloy
OK。同じループ再帰ブロックで私の怠惰なseqをビルドすると、少し難しくなります。しかし、あなたは私に何かを与えてくれたことは間違いありません。 – Don