簡體   English   中英

在Clojure中循環瀏覽多個地圖

[英]Looping through multiple maps in clojure

埃洛朋友們,

我問這個問題真是愚蠢……但是,在為這個問題苦苦掙扎了一段時間之后,我已經決定另一雙眼睛可能有助於闡明我的問題。

我試圖同時遍歷兩條記錄和一張地圖(我也可以將地圖重寫為一條記錄,但是我沒有必要),同時比較一些條目,如果條目匹配,則更改值。 我所擁有的與此類似:

編輯:這是嘗試專門描述我在做什么。 但是,現在我考慮一下,也許這不是解決問題的最佳方法。

我正在嘗試使用clojure為AI課程創建一個餐廳選擇推理引擎。 我對clojure的經驗很少,但最初想創建一個名為“ restaurant”的結構,以便可以創建它的多個實例。 我讀到Clojure中的結構已被棄用,因此可以改用記錄。 從文本文件中讀取的餐館和用戶輸入都存儲為“餐館”記錄。

我從以前排序的文本文件數據庫中讀取了有問題的餐廳的屬性(名稱,美食類型,等級,位置,價格等),然后將它們放入向量中。

每個屬性都有一個與之相關的權重,因此當用戶輸入搜索條件時,可以根據最可能是權重最高的商品(例如,餐館名稱是最重要的項目,其次是美食的類型,然后是評分等。) 因此,記錄還具有“相關性”屬性。

    (defrecord Restaurant [resturant-name  cuisine 
                           rating          location 
                           price           relevance])
    ;stuff
    ;stuff
    ;stuff


    (defn search
      [restaurants user-input]

    (def ordered-restaurants [])

      (doseq [restaurant restaurants]
       (let [restaurant-relevance-value 0]

        (doseq [input             user-input
                attributes        restaurant
                attribute-weight  weights]

          (cond
            (= input (val attributes))  
            (def restaurant-relevance-value (+ restaurant-relevance-value 
            (val attribute-weight)))))

    (assoc restaurant :relevance restaurant-relevance-value)
    (def ordered-restaurants (conj ordered-restaurants restaurant))))

  (def ordered-restaurants (sort-by > (:relevance ordered-restaurants)))

   ordered-restaurants)


 ;more stuff
 ;more stuff
 ;more stuff


 (defn -main
  [& args]

   (def restaurant-data (process-file "resources/ResturantDatabase.txt"))

   (let [input-values (Restaurant. "Italian" "1.0" "1.0" "$" "true"
      "Casual" "None" "1")]

    (println :resturant-name (nth (search restaurant-data input-values) 0))))

因此,我們的想法是迭代每個餐廳,並將屬性值與用戶的輸入值進行比較。 如果存在匹配項,則將本地相關性值變量添加到其關聯的權重值。 之后,將其放入向量中,進行排序並返回。 然后可以將結果顯示給用戶。 理想情況下,-main中的示例將打印最相關的餐廳的名稱。

正如評論所解釋的,您必須掌握本機Clojure數據結構的不變性。 您不應該在基本算法中使用doseq副作用的doseq

relevance屬性不是 Restaurant的屬性。 您想要的是構建從餐廳到相關性的地圖,以某種方式計算相關性。 然后,您想按值對該映射進行排序。 標准sorted-map不會執行此操作-它通過key進行排序。 您可以對映射條目進行排序,但是有一個現成的優先級映射 ,它將自動為您提供所需的結果。

您還必須決定如何識別餐廳,就像使用數據庫一樣。 如果resturant-name是唯一的,則它們將起作用。 如果不是這樣,使用人工標識符(例如數字)可能會更好。 您可以將它們用作餐廳地圖和您要訂購的Relevene地圖的鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM