String 如何模仿类似“的东西”;“设置交叉点”;及;“集合并集”;使用Clojure(脚本)字符串?

String 如何模仿类似“的东西”;“设置交叉点”;及;“集合并集”;使用Clojure(脚本)字符串?,string,clojure,clojurescript,set-theory,String,Clojure,Clojurescript,Set Theory,假设S和T是分别定义如下的字符串: ;; S A B C ;; T B C D 是否存在满足以下条件的类似clojure(脚本)操作字符串交叉和字符串并集(缺少更好的名称) (string-intersection S T) ;; => ;; B ;; C 及 如您所见,string intersection将消除(逐行)不匹配的行(只留下匹配的行),而string union具有合并行和忽略重复行的效果 注意:我正在使用clojurescript,但我想答案也会推广到clojur

假设
S
T
是分别定义如下的字符串:

;; S
A
B
C

;; T
B
C
D
是否存在满足以下条件的类似clojure(脚本)操作
字符串交叉
字符串并集
(缺少更好的名称)

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

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


注意:我正在使用clojurescript,但我想答案也会推广到clojure。

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

要使用集合,可以使用
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)))
(str/join "\n" s-t-union-sorted)
;; => "A\nB\nC\D"

(str/join "\n" s-t-intersection-sorted)
;; => "B\nC"
然后可以计算并集和交点:

(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")
您还可以将其转换回字符串:

(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)))
(str/join "\n" s-t-union-sorted)
;; => "A\nB\nC\D"

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

您应该能够在大多数语言中实现这两个function,方法是将两个字符串按行拆分、排序(如果无序)和合并。这两个函数的合并策略不同。