2015-10-16 20 views
3

我有一個包含一些字符串和整數向量的向量:Clojure的 - 裏面的載體矢量獲取數據

(def data [ 
["a" "title" "b" 1] 
["c" "title" "d" 1] 
["e" "title" "f" 2] 
["g" "title" "h" 1] 
]) 

我試圖通過向量並返回包含任何行迭代(?)某些字符串例如「一個」。我試圖實現這樣的事情:

(defn get-row [data] 
    (for [d [data] 
     :when (= (get-in d[0]) "a")] d 
)) 

我很新Clojure的,但我相信這是說:對於「數據」的每一個元素(矢量),如果向量包含「一」,返回它?

我知道接力需要2個參數,那部分是我不知道該怎麼做的地方。

我看過像thisthis這樣的答案,但我真的不明白他們是如何工作的。從我能收集到的信息中,他們正在將矢量轉換爲地圖並對其進行操作?

回答

4
(filter #(some #{"a"} %) data) 

這是一個有點奇怪看到一套#{"a"},但它的工作原理爲some謂詞功能。添加更多條目的設置會像一個邏輯或爲它,即

(filter #(some #{"a" "c"} %) data) 
=> (["a" "title" "b" 1] ["c" "title" "d" 1]) 
+0

謝謝,這個工作,但我真的不知道如何?我是否正確地認爲你所做的是將數據中的所有元素(%)過濾爲僅包含「a」的集合? – Touchdown

+0

{**過濾**數據由'{** set **「a」}識別的{**有一些**元素? }} –

+0

在Clojure中,除了一個數據結構之外,一個集合也是一個函數。將函數#{「a」「b」}應用於某個值將返回該值,如果它是「a」或「b」,則返回nil。 'some'依次對一個序列中的每個值應用一個函數,直到找到一個返回真值的函數。 'filter'按照順序遍歷每個元素,並且只保留那些返回真值的元素給你的函數。我建議你在REPL http://www.playclj.com/ – shmish111

0
(defn get-row [data] 
    (for [d data ; <-- fix: [data] would result 
       ; in one iteration with d bound to data 
     :when (= (get-in d[0]) "a")] 
    d)) 

觀察你的算法返回行,其中第一列是「A」。這可以e。 G。可以使用some作爲謂詞函數來解決整行的問題。

(defn get-row [data] 
    (for [row data 
     :when (some #{"a"} row)] 
    row)) 
1

確定你有錯誤代碼

(defn get-row [data] 
    (for [d [data] 
     :when (= (get-in d[0]) "a")] d 
)) 

的錯誤是在這裏: (for [d [data] ... 遍歷所有你不應該括在括號data的元素,因爲這句法是一個用於創建矢量。這裏你試圖遍歷一個元素的向量。這是它的外觀像Clojure的:

(for [d [[["a" "title" "b" 1] 
       ["c" "title" "d" 1] 
       ["e" "title" "f" 2] 
       ["g" "title" "h" 1]]] ... 

所以,正確的變種是:

(defn get-row [data] 
    (for [d data 
     :when (= "a" (get-in d [0]))] 
    d)) 

然後,你可以使用Clojure的」解構爲:

(defn get-row [data] 
    (for [[f & _ :as d] data 
     :when (= f "a")] 
    d)) 

但更clojuric方式是使用更高階的功能:

(defn get-row [data] 
    (filter #(= (first %) "a") data)) 

這是關於你的代碼。但是corretc變體在其他人的答案中,因爲在這裏你只是檢查第一項。

+0

中使用所有3個函數。謝謝你的解釋,我明白我現在要去哪裏錯了。 – Touchdown

0

甚至比當前選擇的答案比較好,這會工作:

(filter #(= "a" (% 0)) data) 

這樣做的原因是因爲頂端回答您正在搜索的子向量的所有索引查詢,而你可能只想看看每個子向量的第一個索引(在這種情況下,在返回整個子向量前搜索「a」,然後返回整個子向量)