如何模仿类似"设置交叉点"和"设置联盟"用Clojure(脚本)字符串?

时间:2016-04-24 23:50:54

标签: string clojure clojurescript set-theory

假设ST分别定义如下字符串:

;; S
A
B
C

;; T
B
C
D

是否有满足以下条件的类似的clojure(脚本)操作string-intersectionstring-union(缺少更好的名称)?

(string-intersection S T)
;; => 
;; B
;; C

(string-union S T)
;; => 
;; A
;; B
;; C
;; D

正如您所看到的,string-intersection将消除(逐行)不匹配的行(只留下匹配的行),而string-union具有组合行的效果并忽略重复。

注意:我正在使用clojurescript,但我想这个答案也可以概括为clojure。

1 个答案:

答案 0 :(得分:2)

根据您的描述,您似乎希望将字符串视为一组行并计算集合交集和并集。

对于使用集合,您可以使用clojure.set命名空间。

首先将字符串转换为一组行:

(require '[clojure.string :as str]
         '[clojure.set :as set])

(def s "A\nB\nC")
(def t "B\nC\nD")

(def s-set (into #{} (str/split-lines s)))
(def t-set (into #{} (str/split-lines t)))

然后你可以计算你的联合和交集:

(def s-t-union (set/union s-set t-set))
;; => #{"C" "B" "A" "D"}

(def s-t-intersection (set/intersection s-set t-set))
;; => #{"C" "B"}

并对其进行排序:

(def s-t-union-sorted (sort s-t-union))
;; => ("A" "B" "C" "D")

(def s-t-intersection-sorted (sort s-t-intersection))
;; => ("B" "C")

您还可以将其转换回字符串:

(str/join "\n" s-t-union-sorted)
;; => "A\nB\nC\D"

(str/join "\n" s-t-intersection-sorted)
;; => "B\nC"