给定一系列项目,我想找到n个最频繁的项目,按频率降序排列.所以例如我希望这个单元测试通过:
(fact "can find 2 most common items in a sequence"
(most-frequent-n 2 ["a" "bb" "a" "x" "bb" "ccc" "dddd" "dddd" "bb" "dddd" "bb"])
=>
'("bb" "dddd"))
Run Code Online (Sandbox Code Playgroud)
我是Clojure的新手,仍然试图掌握标准库.这是我想出的:
(defn- sort-by-val [s] (sort-by val s))
(defn- first-elements [pairs] (map #(get % 0) pairs))
(defn most-frequent-n [n items]
"return the most common n items, e.g.
(most-frequent-n 2 [:a :b :a :d :x :b :c :d :d :b :d :b]) =>
=> (:d :b)"
(take n (->
items ; [:a :b :a :d …Run Code Online (Sandbox Code Playgroud) 假设我们有这种结构(有史以来最简单的结构之一):
type some struct{
I uint32
}
Run Code Online (Sandbox Code Playgroud)
我们希望有一个这种类型的变量,并在for循环中原子递增(可能在另一个goroutine,但现在故事是不同的).我做以下事情:
q := some{0}
for i := 0; i < 10; i++ {
atomic.AddUint32(&q.I,1) // increment [1]
fmt.Println(q.I)
}
Run Code Online (Sandbox Code Playgroud)
我们得到了我们期望的东西,到目前为止一直很好,但是如果我们为这种类型声明一个函数如下:
func (sm some) Add1(){
atomic.AddUint32(&sm.I,1)
}
Run Code Online (Sandbox Code Playgroud)
并在上面的示例(行[1])中调用此函数,该值不会递增,我们只是得到零.问题很明显 - 为什么?
这必须是基本的东西,但由于我是新手,我没有意识到.