我需要過濾地圖,但是過濾器應該將該值與前一個進行比較,並且過濾後的地圖應該只包含具有前一個不同信號的值。將地圖值與clojure進行比較
這裏有一個例子:
Map to filter: {:key1 100 :key2 10 :key3 -20 :key4 -10 :key5 10}
Return: {:key3 -20 :key5 10}
的我怎麼能做到這一點任何sugestion?
我需要過濾地圖,但是過濾器應該將該值與前一個進行比較,並且過濾後的地圖應該只包含具有前一個不同信號的值。將地圖值與clojure進行比較
這裏有一個例子:
Map to filter: {:key1 100 :key2 10 :key3 -20 :key4 -10 :key5 10}
Return: {:key3 -20 :key5 10}
的我怎麼能做到這一點任何sugestion?
我可能會使用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])
地圖中的按鍵沒有排序,所以您需要定義「下一個」按鍵應該是什麼,才能使其可靠工作。 – Lee
雖然我同意你的評論,但我認爲這是問題說明的問題,而不是我的答案。 – user12341234
建議在你的第一行使用'(into(sorted-map)...)',使它實際上排序,並且在'(map first)'之後加入以實現OP提到的映射結果。 – Josh
,如果你使用的分類地圖,而不是直接映射的問題可能會更好,所以'(分揀地圖:KEY1 100:10 KEY2:KEY3 -20:KEY4 -10:10 KEY5)'。那麼* previous *的概念就有意義了。 –
其我的理解是,小(少於8條)地圖文字全部排序。所以在這個特定的例子中它很好,但對於更大的例子,它可能不是。 – user12341234
對不起,我的錯誤,就像在真正的程序中這個鍵是日期,我可以創建它們的排序圖。 – Pituca292