如何使用开始/停止谓词对列表的连续元素进行分组? [英] How can I group consecutive elements of list using start/stop predicates?

查看:54
本文介绍了如何使用开始/停止谓词对列表的连续元素进行分组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个列表,例如:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆