2016-11-09 16 views
0

私はAmazonを検索して指定された本の情報を返すプログラムを持っています。一度すべての検索が実行されると、SalesRankで書籍を並べ替えることができたかったのです。問題は、ベクトルを1つの大きなコレクションにまとめることができることです。今、私はそれらを1つずつ印刷させることができますが、各繰り返しは前のものを上書きします。私は関数型プログラミングNOOBなので、どんな助けにも感謝しています。以下は抜粋です:複数のベクトルを1つにまとめて合成する

(defn get_title_and_rank_for_one_isbn [isbn] 

     (def book_title (get-in (amazon_search isbn)[:items 0 :item-atributes :title])) 
     (def sales_rank(get-in (amazon_search isbn)[:items 0 :SalesRank])) 
     (def book_isbn(get-in (amazon_search isbn)[:items 0 :asin])) 

) 

(defn get_title_and_rank_for_all_isbns [list_of_isbns] 
    (doseq [isbn list_of_isbns] 
     (Thread/sleep 3000) 
     (get_title_and_rank_for_one_isbn isbn) 
     (def combine_attributes(reduce into [[book_title] [book_isbn] [sales_rank]])) 
     (println combine_attributes) 
    ) 

) 
+2

これは数時間前に投稿したのと同じ質問です。あなたはSOの新しい口座名で再転記しません。この質問はあなたのために閉鎖される前に親切に削除してください。誰かが時間通りにあなたを助けます。その間、あなた自身の問題に取り組んでください。多分本を手に入れる。 – jmargolisvt

+2

ここから始めたいと思うかもしれません:http://clojure-doc.org/articles/tutorials/getting_started.html –

+0

@jmargolisvt他のアカウントはありません。私を他の投稿にリンクすることはできますか?おそらくそれはクラスメイトです。 –

答えて

0
(defn- get-books [data] 
    (letfn [(one-book [book] 
      (let [title (get-in book :title) 
        rank (get-in book :rank) 
        isbn (get-in book :isbn)] 
       {:title title 
       :rank rank 
       :isbn isbn}))] 
      (map one-book data)))) 

は、これを行うには、いくつかの方法は、おそらくありますが、これは、いくつかの単純化されたコードを1回のテイクです。関数を次のように呼び出すことができます。(println (get-books data))ここで、dataはjson構造体です。

get-booksで何が起こっているのですか? leftnでは、ここでカプセル化できる関数を定義することができます。 Clojure関数は定義された最後のものを返します。この場合、関数はmapです。実際、ここでは「実行されている」唯一のものです。これは、letを使用するone-book関数にデータをマップし、各本が関数を通過するときにバインドされたバインディングを作成します。これは、defの使用についてのあなたの考えを取り入れています。

再び、one-bookは、キー値構造である最後の定義を返します。すべてのデータをマップし、それをプリントアウトしたり、別の関数に渡したり、必要な処理をします。

これは、データの処理方法や関数から値を返す方法を考える上での示唆ではありません。

+0

うわー、これは素晴らしいテンプレートです。 Clojureでタスクを実行してください。このような詳細な回答をするのに時間を割いていただき、本当にありがたいです。 –

+0

本当にありがとうございます。 – jmargolisvt

0

まず、(amazon_search isbn)はisbnごとに1回だけ実行する必要があります。

次にそれぞれの検索結果に対してmapを入力し、希望のデータを新しいマップに抽出して、最終的に販売ランクで並べ替えます。

(defn get-book [isbn] 
    (let [itm (get-in (amazon_search isbn) [:items 0])] 
    {:book/title (get-in itm [:item-attributes :title]) 
     :book/sales-rank (:SalesRank itm) 
     :book/isbn (:asim itm)})) 

(defn get-books-sorted-by-sales-rank [isbns] 
    (->> isbns (map get-book) (sort-by :book/sales-rank))) 

;; a bit more performant 
関連する問題