2017-07-03 120 views
0

我需要過濾地圖,但是過濾器應該將該值與前一個進行比較,並且過濾後的地圖應該只包含具有前一個不同信號的值。將地圖值與clojure進行比較

這裏有一個例子:

Map to filter: {:key1 100 :key2 10 :key3 -20 :key4 -10 :key5 10} 
Return: {:key3 -20 :key5 10} 

的我怎麼能做到這一點任何sugestion?

+1

,如果你使用的分類地圖,而不是直接映射的問題可能會更好,所以'(分揀地圖:KEY1 100:10 KEY2:KEY3 -20:KEY4 -10:10 KEY5)'。那麼* previous *的概念就有意義了。 –

+0

其我的理解是,小(少於8條)地圖文字全部排序。所以在這個特定的例子中它很好,但對於更大的例子,它可能不是。 – user12341234

+0

對不起,我的錯誤,就像在真正的程序中這個鍵是日期,我可以創建它們的排序圖。 – Pituca292

回答

2

我可能會使用partition-by,它根據序列何時改變值來分割一個序列。我們可以告訴partition-by查看這些值的「符號」,然後只取出每個塊中的第一個結果。

(->> {:key1 100 :key2 10 :key3 -20 :key4 -10 :key5 10} 
    (partition-by #(Integer/signum (val %))) 
    rest 
    (map first)) 

=> ([:key3 -20] [:key5 10]) 
+3

地圖中的按鍵沒有排序,所以您需要定義「下一個」按鍵應該是什麼,才能使其可靠工作。 – Lee

+0

雖然我同意你的評論,但我認爲這是問題說明的問題,而不是我的答案。 – user12341234

+0

建議在你的第一行使用'(into(sorted-map)...)',使它實際上排序,並且在'(map first)'之後加入以實現OP提到的映射結果。 – Josh