다음은 어떻게 수행할까요? 중간 단계를 더 쉽게 시각화하기 위해 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)))
결과는 다음과 같습니다 1 단계는 부동 소수점 모든 문자열 판매 값을 변환하는 것입니다
---------------------------------------
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
을 사용하여 빵 등을 연필에서 분리하는 것이 가장 쉽습니다. 생각을 쉽게하기 위해 각 단계를 구분하고 각 단계마다 디버그 출력물을 넣을 수 있습니다.
IMHO 내가 좋아하는 IDE/편집기에 머물러있어 REPL을 사용하는 것보다 더 간단합니다. 입력 한 내용은 내가 마자 마자 사라지 자마자 파일에 저장됩니다.
필자는 거의 동일한 대답을 작성했을 것입니다. 변형은 적어도 하나의 게으름 수준의 오버 헤드를 피하기 때문에 트랜스 듀서로 '입력'을 사용하는 것과 같습니다. 다음과 같이 :'({group} : product 테이블에) {} (map (comp ,,,)))'. – glts