2016-11-09 72 views
0

我有一个程序执行到亚马逊的搜索并返回指定书上的信息。一旦执行了所有搜索,我希望能够通过SalesRank对书籍进行排序。我遇到的问题是能够将载体组合成一个大集合。现在我可以让他们逐一打印,但每次迭代都会覆盖前一个。我是一个函数式编程NOOB,所以任何帮助表示赞赏。下面是一个片段:在clojure中将一系列向量合并为一个

(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)))) 

可能有几种方法可以做到这一点,但是这是一个需要一些简单的代码。你可能会这样调用函数:(println (get-books data))其中data是你的json结构。

那么get-books发生了什么? leftn允许您定义您可以封装在这里的函数。 Clojure函数将返回最后定义的东西,在这种情况下,它是map函数。事实上,它几乎是这里“运行”的唯一东西。它将数据映射到one-book函数,该函数使用let创建绑定,并在每本书通过该函数时重新绑定。这代替了你对使用def的想法。

同样,one-book返回它的最后一个定义,它是一个键值结构。您可以映射所有数据,然后将其打印出来,传递给另一个函数,或者任何您需要的数据。

这不是一个确切的解决方案,而是一个关于如何思考处理数据以及如何从函数返回值的建议。

+0

哇!这是一个很棒的模板,它给了我一个更好的想法,在Clojure中执行任务我真的很感激你花时间给出这样一个详细的答案 –

+0

当然,一个合适的SO谢谢你会接受答案。 – jmargolisvt

0

首先观察(amazon_search isbn)应该只运行一次isbn。

然后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