2011-08-13 9 views
16

マップのベクトルで操作を行うための多くのドキュメントやコーディング例が見つかりませんでした。例えば、私はClojureのマップ処理のベクトル

(def student-grades 
[{:name "Billy" :test1 74 :test2 93 :test3 89} 
    {:name "Miguel" :test1 57 :test2 79 :test3 85} 
    {:name "Sandy" :test1 86 :test2 97 :test3 99} 
    {:name "Dhruv" :test1 84 :test2 89 :test3 94}]) 

持っていると私は追加したり、私が上に読むべき機能テストの平均値のための新しいキーと値のペアを、関連付けたい場合は?また、誰かがClojureでマップのベクトルの参照/リソースを知っている場合は、共有してください!本当にありがとう!

答えて

10

この場合、マップは、コレクション上の関数です(これはちょうどベクトルになります)。コレクション内の各要素(あたかもマップ上の不都合な名前の衝突である)のために、古いマップのすべてのキーと値のペアに新しいキーを加えた新しいマップを生成したい場合は、としましょう:平均

あなたがそれにドキュメントを取得するには(DOCは、fn-name)を使用することができます

(into [] ; optional -- places the answer into another vector 
    (map ; apply the given function to every element in the collection 
    (fn [sg] ; the function takes a student-grade 
     (assoc sg ; and with this student-grade, creates a new mapping 
     :avg ; with an added key called :avg 
     (/ (+ (:test1 sg) (:test2 sg) (:test3 sg)) 3.0))) 
    student-grades ; and the function is applied to your student-grades vector 
)) 

PS;あなたがClojureを初めて使う人なら、irc.freenode.net #clojureのフレンドリーな人たちと遊び、本を読むことをお勧めします。私のお気に入りは現在Programming Clojureですが、O'Reillyの今後のClojureの書籍呼吸。

+0

ありがとうございました!私はclojuredocs.orgをちょっと調べてきました。コレクションのコレクションに関連する例は見つけられませんでした。 – Adam

+1

問題ありません!機能プログラミングの美しさは、ビルディングブロックがスタックするだけなので、外側のコレクションを扱うときは、内側のコレクションを扱うだけで済みますが、抽象的には単純な要素として、そして同様にこれらの要素の1つを変換する関数を書くときには、外側のコレクションについて心配する必要はありません。あなたはそれのハングアップを得るでしょう:) –

+2

'((マップ[...])'の便宜のために '(mapv ...)'を使うこともできます。 – Peeja

4

Hircusはすでに良い答えを提供するが、ここでは比較のための別の実装ですしています

(defn average [nums] 
    (double (/ (apply + nums) (count nums)))) 

(map 
    #(assoc % :avg (average ((juxt :test1 :test2 :test3) %))) 
    student-grades) 

=> ({:avg 85.33333333333333, :name "Billy", :test1 74, :test2 93, :test3 89} etc....) 

コメントは注意する:それはそのように「平均」などの一般的な機能を分離する通常価値が

  • よく分かりやすい別の関数
  • juxtは、マップからコンポーネント値の特定のリストを抽出するのに非常に便利な機能です。
+0

ありがとう、私は非常に多くの便利な機能を学んで、そのリストにjuxtを追加しようとしています! – Adam

+0

心配はいりません! p.s.この場合のjuxtの使用法は、キーワード( ":test1"など)を関数として使用できるという事実を利用しているので、少し巧妙です。しかし、あなたは任意の機能でそれを使うことができます。 – mikera

+0

[発明者のパラドックス](https://en.wikipedia.org/wiki/Inventor%27s_paradox):特定の問題を解決するよりも一般的な問題を解決する方が簡単な場合もあります。 – Zaz

関連する問題