ここで私はそれをやります。私はspyx-pretty
from the Tupelo libraryを使用して中間ステップの視覚化を容易にしました(API docs can be found here)。コード:
(ns tst.demo.core
(:use demo.core
tupelo.test)
(:require [tupelo.core :as t]
[clojure.string :as str]))
(t/refer-tupelo)
(def table
[{:product "Pencil" :city "Toronto" :year "2010" :sales "2653.00"}
{:product "Pencil" :city "Oshawa" :year "2010" :sales "525.00"}
{:product "Bread" :city "Toronto" :year "2010" :sales "136,264.00"}
{:product "Bread" :city "Oshawa" :year "nil" :sales "242,634.00"}
{:product "Bread" :city "Ottawa" :year "2011" :sales "426,164.00"}])
(defn str->double
"Convert a string like '2,123.97' to a double like 2123.97 "
[str-val]
(let [no-commas (str/replace str-val #"," "")
dbl-val (Double/parseDouble no-commas)]
dbl-val))
(dotest
(let [table-num (forv [item table]
(update item :sales str->double))
grouped (group-by :product table-num)
>> (spyx-pretty grouped)
group-max (forv [group grouped]
(do
(spyx-pretty group)
(let [records (xsecond group)
>> (spyx-pretty records)
records-sorted (sort-by :sales > records)
>> (spyx-pretty records-sorted)
max-rec (xfirst records-sorted)
]
(spyx max-rec))))]
(spyx-pretty group-max)))
結果は以下のとおりです。第一ステップは、浮動小数点へのすべての文字列の売上値を変換することであることを
---------------------------------------
Clojure 1.9.0-beta1 Java 9.0.1
---------------------------------------
Testing tst.demo.core
grouped =>
{"Pencil"
[{:product "Pencil", :city "Toronto", :year "2010", :sales 2653.0}
{:product "Pencil", :city "Oshawa", :year "2010", :sales 525.0}],
"Bread"
[{:product "Bread", :city "Toronto", :year "2010", :sales 136264.0}
{:product "Bread", :city "Oshawa", :year "nil", :sales 242634.0}
{:product "Bread", :city "Ottawa", :year "2011", :sales 426164.0}]}
group =>
["Pencil"
[{:product "Pencil", :city "Toronto", :year "2010", :sales 2653.0}
{:product "Pencil", :city "Oshawa", :year "2010", :sales 525.0}]]
records =>
[{:product "Pencil", :city "Toronto", :year "2010", :sales 2653.0}
{:product "Pencil", :city "Oshawa", :year "2010", :sales 525.0}]
records-sorted =>
({:product "Pencil", :city "Toronto", :year "2010", :sales 2653.0}
{:product "Pencil", :city "Oshawa", :year "2010", :sales 525.0})
max-rec => {:product "Pencil", :city "Toronto", :year "2010", :sales 2653.0}
group =>
["Bread"
[{:product "Bread", :city "Toronto", :year "2010", :sales 136264.0}
{:product "Bread", :city "Oshawa", :year "nil", :sales 242634.0}
{:product "Bread", :city "Ottawa", :year "2011", :sales 426164.0}]]
records =>
[{:product "Bread", :city "Toronto", :year "2010", :sales 136264.0}
{:product "Bread", :city "Oshawa", :year "nil", :sales 242634.0}
{:product "Bread", :city "Ottawa", :year "2011", :sales 426164.0}]
records-sorted =>
({:product "Bread", :city "Ottawa", :year "2011", :sales 426164.0}
{:product "Bread", :city "Oshawa", :year "nil", :sales 242634.0}
{:product "Bread", :city "Toronto", :year "2010", :sales 136264.0})
max-rec => {:product "Bread", :city "Ottawa", :year "2011", :sales 426164.0}
group-max =>
[{:product "Pencil", :city "Toronto", :year "2010", :sales 2653.0}
{:product "Bread", :city "Ottawa", :year "2011", :sales 426164.0}]
注意。それで、組み込み関数group-by
を使って、鉛筆をBreadなどから分離するのが最も簡単です。私は、それぞれのステップを分かりやすくするために別々のステップを分けておくのが好きです。また、各ステップでデバッグ印刷を行うこともできます。
これは、私がお気に入りのIDE /エディタにとどまることができるので、REPLを使うよりも簡単です。入力したものは、ヒットするとすぐに消えるのではなく、ファイルに保存されます。 clojure.coreで便利な機能max-key
がある
私はほぼ同じ答えを書いていたでしょう。これは少なくとも1つのレベルの怠惰のオーバーヘッドを避けるため、トランスデューサで 'into 'を使いたいというバリエーションです。このように: '(into {}(map(comp ,,,))(group-by:productテーブル))'。 – glts