【发布时间】:2014-10-14 03:53:15
【问题描述】:
我正在尝试对直接出现在彼此旁边的项目进行分组,只要它们都在给定的“白名单”中。分组必须至少包含两个或更多项目。
例如,第一个 arg 是集合,第二个 arg 是白名单。
(group-sequential [1 2 3 4 5] [2 3])
>> ((2 3))
(group-sequential ["The" "quick" "brown" "healthy" "fox" "jumped" "over" "the" "fence"]
["quick" "brown" "over" "fox" "jumped"])
>> (("quick" "brown") ("fox" "jumped" "over"))
(group-sequential [1 2 3 4 5 6 7] [2 3 6])
>> ((2 3))
这是我想出的:
(defn group-sequential
[haystack needles]
(loop [l haystack acc '()]
(let [[curr more] (split-with #(some #{%} needles) l)]
(if (< (count curr) 2)
(if (empty? more) acc (recur (rest more) acc))
(recur (rest more) (cons curr acc))))))
它有效,但很丑陋。我想知道在 Clojure 中是否有更简单的惯用方法? (在我发现 split-with 之前你应该已经看过 fn 了 :)
我敢打赌,有一个不错的带分区或其他东西的单线,但为时已晚,我似乎无法让它发挥作用。
【问题讨论】:
-
是什么逻辑决定了“棕色”和“狐狸”是分开的?
-
啊,你是对的@noisesmith。那是一个错字。我将在两者之间添加“健康”以使其更清晰。