2016-04-24 17 views
1

Angenommen S und T sind Strings jeweils wie folgt definiert:Wie man etwas wie "setze Schnittmenge" und "setze Vereinigung" mit Clojure (Script) Saiten nachahmen?

;; S 
A 
B 
C 

;; T 
B 
C 
D 

dort sind analog clojure (Skript) Operationen string-intersection und string-union (in Ermangelung eines besseren Namen), die die folgenden Merkmale erfüllen?

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

und

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

Wie Sie sehen können, string-intersection beseitigen würde (auf einer Zeile-für-Zeile-Basis) nicht passenden Linien (so dass nur die Zeilen, die zusammenpassen), während string-union das hat Effekt der Kombination von Linien und Ignorieren von Duplikaten.

HINWEIS: Ich benutze Clojurescript, aber ich stelle mir vor, die Antwort würde verallgemeinern, um auch zu clojure.

+1

Sie sollten in der Lage sein, beide Funktionen in den meisten Sprachen zu implementieren, indem Sie beide Zeichenfolgen in Zeilen aufteilen, sie anordnen (wenn sie nicht geordnet sind) und zusammenführen. Die Zusammenführungsstrategie unterscheidet sich nur für die beiden Funktionen. – maraca

Antwort

2

Aus Ihrer Beschreibung scheint es, dass Sie Ihre Strings als eine Reihe von Linien behandeln und die Schnittmenge und Vereinigung berechnen wollen.

Für die Arbeit mit Sets können Sie clojure.set Namespace verwenden.

Zuerst die Saiten in einen Satz von Linien konvertieren:

(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))) 

Dann können Sie Ihre Vereinigung berechnen und Kreuzung:

(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"} 

Und es sortieren:

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

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

können Sie wandle es auch zurück in String of Linien:

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

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