如何使用clojure查找列表中多次出现的数字

如何使用clojure查找列表中多次出现的数字,clojure,Clojure,我有一张号码表2 4 3 7 4 9 8 5 12 24 8 我需要找到在clojure中重复多次的数字 我使用了频率函数来查找。但结果是 {2 1,4 2,3 1,7 1,9 1,8 2,5 1,12 1,24 1} 我最初考虑将它们视为键值,然后取每个键值一次,看看val是否大于1。如果值大于1,则需要加1 但我无法解决这个问题 谁能帮帮我吗 < P> >无论如何,我可以把它变成 [[ 2 1 ] [4 2 ] [3 1 ] [9 1 ] [8 2 ] [ 2 ] [YOX] [OS] ]

我有一张号码表2 4 3 7 4 9 8 5 12 24 8

我需要找到在clojure中重复多次的数字

我使用了
频率
函数来查找。但结果是

{2 1,4 2,3 1,7 1,9 1,8 2,5 1,12 1,24 1}
我最初考虑将它们视为
键值
,然后取每个键值一次,看看val是否大于1。如果值大于1,则需要加1

但我无法解决这个问题

谁能帮帮我吗

< P> >无论如何,我可以把它变成<代码> [[ 2 1 ] [4 2 ] [3 1 ] [9 1 ] [8 2 ] [ 2 ] [YOX] [OS] ] /代码>并考虑每个向量递归或任何更好的想法,你可以想到。


谢谢。

你走对了方向

如果你在散列映射上排序,e。G通过映射,您可以获得所描述的kv元组结构,并可以在元素转换函数中对单个元组进行分解:

(->> s
     (frequencies)
     (map (fn [[number times]]
            (cond-> number           ; take number
              (> times 1) (inc)))))  ; inc if (times > 1), otherwise return number

如果您想要重复的项目:

(defn repeated [coll]
  (->> coll
       frequencies
       (remove #(= 1 (val %)))
       keys))

(repeated [2 4 3 7 4 9 8 5 12 24 8])
;(4 8)
如果您只想数一数:

(defn repeat-count [coll]
  (->> coll
       frequencies
       (remove #(= 1 (val %)))
       count))

(repeat-count [2 4 3 7 4 9 8 5 12 24 8])
;2
你可以懒洋洋地做,这样它就可以无休止地工作:

(defn repeated [coll]
  ((fn ff [seen xs]
     (lazy-seq
      (when-let [[y & ys] (seq xs)]
        (case (seen y)
         ::several (ff seen ys)
         ::once (cons y (ff (assoc seen y ::several) ys))
         (ff (assoc seen y ::once) ys)))))
   {} coll))

(repeated [2 4 3 7 4 9 8 5 12 24 8])
;(4 8)
这类似于core
distinct


。。。最后,为了简洁起见

(defn repeated [coll]
  (for [[k v] (frequencies coll) :when (not= v 1)] k))


我偷了你的
钥匙。它只适用于地图。但在这里,它在一系列映射条目上运行得非常好

以下功能将在您卡住的地方继续:

(defn find-duplicates [numbers]
  (->> numbers
       (frequencies)
       (filter (fn [[k v]] (> v 1)))
       (keys)))
它将过滤值大于1的映射条目,然后提取它们的键

(find-duplicates [2 4 3 7 4 9 8 5 12 24 8])
;; => (4 8)

您可以使用这种方法

(def c [2 4 3 7 4 9 8 5 12 24 8])

(->> c
     sort
     (partition-by identity)
     (filter #(> (count %) 1))
     (map first))

(>>s(按标识分组)(筛选(comp next val))键)

这很好,但计算成本更高,要达到与其他解决方案相同的计算复杂度,您可以选择
按分组
,而无需
排序
(即
O(nlogn)