clojure - 有没有办法在 Clojure 中一次进行分组和计数?

标签 clojure

假设有如下序列:

["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/

相关文章:

clojure - Clojure 的分析工具?

java - Clojure:将 Spark 工厂方法与 Java 互操作结合使用

testing - 使用 ring-mock 将数据传递到 midje 测试中的解放者后端点

string - 在 Clojure(Script) 中按行字母顺序对字符串进行排序

clojure - 修改参数作为多方法的一部分

clojurescript 断点

java - 将 Java 类转换为 vector - Clojure

clojure - Storm > 如何将 Java 回调集成到 Spout 中

clojure - leinigen 中的类路径问题

clojure - 在 Clojure REPL 中使用导入的 Java 库