2016-04-24 12 views
1

Пусть S и T являются строки определяются соответственно следующим образом:Как подражать чему-то вроде «set intersection» и «set union» с строками Clojure (Script)?

;; S 
A 
B 
C 

;; T 
B 
C 
D 

Существуют аналогичные Clojure (сценарий) операции string-intersection и string-union (за неимением лучшего названия), которые удовлетворяют следующим?

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

и

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

Как вы можете видеть, string-intersection уничтожило бы (на основе строка за строкой), не совпадающие строки (оставляя только те строки, которые соответствуют), в то время как string-union имеет эффект объединения строк и игнорирование дубликатов.

ПРИМЕЧАНИЕ: Я использую clojurescript, но я думаю, что ответ обобщил бы и clojure.

+1

Вы должны иметь возможность реализовать оба функционала на большинстве языков, разделив обе строки в строках, упорядочить их (если они неупорядочены) и слить. Стратегия слияния просто отличается для двух функций. – maraca

ответ

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"