假设有如下序列:
["ab" "ba" "ac" "ca" "bc" "cc"]
我想知道频率,但键应该是排序的字符串。简而言之,我想得到这样的结果:
{"ab" 2, "ac" 2, "bc" 1, "cc" 1}
Clojure 有
frequencies
功能,但它不接受按键功能。所以,通常我可以通过
group-by
的组合来做到这一点和 map
:(->> ["ab" "ba" "ac" "ca" "bc" "cc"]
(group-by #(apply str (sort %)))
(map (fn [[k vs]] [k (count vs)]))
(int {}))
但是,这看起来很冗长。即使在 Java 中,我也可以使用 Stream API 同时进行分组和计数,如下所示:(假设有一个方法
sortedStr(s)
Arrays.asList("aa", "ab", "ab", "bb", "cc" , "ca")
.stream()
.collect(groupingBy(s->sortedStr(s), counting()));
有没有办法像 Java8 一样在 clojure 中进行分组和计数?
最佳答案
这是使用内置 frequencies
的 Clojure 版本功能。
(frequencies (map #(apply str (sort %))
["ab" "ba" "ac" "ca" "bc" "cc"]))
;;=> {"ab" 2, "ac" 2, "bc" 1, "cc" 1}
我可能错了,但 Java 版本已经在您的示例中获得了排序键。在这种情况下,只需调用
frequencies
在 Clojure 中(如果我正确理解了您的问题)。编辑:看起来 Java 版本同时被更正了,所以我的最后一条评论已经过时了。
关于clojure - 有没有办法在 Clojure 中一次进行分组和计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38884410/