2009-10-02 15 views

Odpowiedz

5
user=> (use 'clojure.set) 
nil 
user=> (difference (set [1 2 3 4 5]) (set [2 3 5])) 
#{1 4} 

referencyjny:

+0

Czy coś jest nie tak z tym rozwiązaniem? –

+2

Wektor nie jest zbiorem. Kolejność wektoryzacji nie jest zachowywana po przekonwertowaniu jej na zestaw. Jeśli rozumie pytanie prawidłowo (różnica (zestaw [9 2 3 4 5]) (ustaw [2 3 5])) powraca # {4 9} w którym powinny powrócić [9 4] i (różnica (set [1 1 2 3 4 5]) (set [2 3 5])) powinien wrócić [1 1 4], a nie # {1 4} Jeśli chciał ustawić semantykę prawdopodobnie użyłby zestawu do zaczynać się. – Jonas

+0

Dzięki, Jonas. Prawdopodobnie masz rację, nie chcąc ustawić semantyki. –

17

Spróbuj tego:

(let [a [1 2 3 4 5] 
     b [2 3 5]] 
    (remove (set b) a)) 

która zwraca (1 4).

Nawiasem mówiąc, funkcja remove pobiera predykat i kolekcję i zwraca sekwencję elementów, które nie spełniają predykatu (zestaw, w tym przykładzie).

+1

... która jest O (n + m) – Thumbnail

+0

jak działa funkcja '(set)' jako predykat dla 'remove'? Czy ktoś może to wyjaśnić? Nie wymaga predykatu, aby zwrócić false dla niektórych elementów w coll? – amirteymuri

+0

Zestaw jest także funkcją, która zwróci wartość, która jest podana, jeśli ta wartość jest sama w sobie, lub zero, jeśli nie jest. Jeśli użyjesz tej funkcji jako predykatu, zwrócona wartość stanie się prawdziwa, lub nil zwrócony stanie się fałszem. Dzieje się tak dlatego, że w Clojure zero to "falsey". –

1

Można to zrobić samemu coś podobnego:

(def a [2 3 5]) 
(def b [1 2 3 4 5]) 

(defn seq-contains? 
    [coll target] (some #(= target %) coll)) 

(filter #(not (seq-contains? a %)) b) 
; (3 4 5) 

wersji opartej na bibliotece reducers mogą być:

(require '[clojure.core.reducers :as r]) 

(defn seq-contains? 
[coll target] 
    (some #(= target %) coll)) 

(defn my-remove 
"remove values from seq b that are present in seq a" 
[a b] 
(into [] (r/filter #(not (seq-contains? b %)) a))) 

(my-remove [1 2 3 4 5] [2 3 5]) 
; [1 4] 

EDITDodany nast-zawiera? kod

+2

Witaj Mikołaju, może brakuje mi punktu, ale AFAIK zawiera? tak naprawdę nie sprawdza "zawartości" raczej sprawdza indeks, sprawdź ten przykład; (zawiera? [7 2 3 4 5 6] 6) ;; false, nie ma elementu w indeksie 6, chociaż jest element 6. –

+0

Dziękuję za wskaźnik. Zupełnie zapomniałam. Dodano kod dla seq-zawiera? funkcjonować. –

0

Oto moje podejście bez użycia zestawów;

Powiązane problemy