如何使用开始/停止谓词对列表的连续元素进行分组? [英] How can I group consecutive elements of list using start/stop predicates?
本文介绍了如何使用开始/停止谓词对列表的连续元素进行分组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我有一个列表,例如:
Suppose I have a list like:
(def data [:a :b :c :d :e :f :g :h :b :d :x])
以及谓词:
(defn start? [x] (= x :b))
(defn stop? [x] (= x :d))
标记第一个&子序列的最后一个元素。我想返回带有子组的列表,如下所示:
that mark the first & last elements of a sub-sequence. I want to return a list with subgroups like so:
(parse data) => [:a [:b :c :d] :e :f :g :h [:b :d] :x]
如何使用Clojure完成此任务?
How can I use Clojure to accomplish this task?
推荐答案
您可以使用自定义的有状态转换器:
You could use a custom stateful transducer:
(defn subgroups [start? stop?]
(let [subgroup (volatile! nil)]
(fn [rf]
(fn
([] (rf))
([result] (rf result))
([result item]
(let [sg @subgroup]
(cond
(and (seq sg) (stop? item))
(do (vreset! subgroup nil)
(rf result (conj sg item)))
(seq sg)
(do (vswap! subgroup conj item)
result)
(start? item)
(do (vreset! subgroup [item])
result)
:else (rf result item))))))))
(into []
(subgroups #{:b} #{:d})
[:a :b :c :d :e :f :g :h :b :d :x])
; => [:a [:b :c :d] :e :f :g :h [:b :d] :x]
这篇关于如何使用开始/停止谓词对列表的连续元素进行分组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文