我需要过滤地图,但是过滤器应该将该值与前一个进行比较,并且过滤后的地图应该只包含具有前一个不同信号的值。将地图值与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