36

まず、各構造固有のシーケンスには、アイテムを削除するさまざまな方法があると思います。ベクトルはインデックスによるものであり、リストは最初または最後に削除される可能性があり、セットは削除する実際のアイテムを渡す必要があるなどです。

第二に、構造にとらわれない除去方法がいくつかあると思います。それらはseqインターフェイスで動作します。

Clojure ではシーケンスは不変であるため、実際に行っていることは、元のアイテムを除いて、元の安価なコピーを作成していると思われます。これは、リスト内包表記を削除に使用できることを意味しますが、不必要に冗長になるのではないかと思います。

Clojure シーケンスからアイテムを削除するさまざまな方法の慣用的な例をいくつか挙げてください。

4

3 に答える 3

45

おそらくパフォーマンス特性が異なるために、Clojureのすべてのデータ構造タイプから物事を削除するための単一のインターフェースはありません。

(disj #{:foo :bar} :foo)       ; => #{:bar}
(dissoc {:foo 1 :bar 2} :foo)  ; => {:bar 2}
(pop [:bar :foo])              ; => [:bar]
(pop (list :foo :bar))         ; => (:bar)

これらも機能します(を返しますseq):

(remove #{:foo} #{:foo :bar})      ; => (:bar)
(remove #{:foo} [:foo :bar])       ; => (:bar)
(remove #{:foo} (list :foo :bar))  ; => (:bar)

これはハッシュマップでは機能しません。マップを反復処理すると、キーと値のペアが取得されるためです。しかし、これは機能します:

(remove (fn [[k v]] (#{:foo} k)) {:foo 1 :bar 2})  ; => ([:bar 2])
于 2009-06-02T18:19:52.917 に答える
12

シーケンスの Clojure リファレンスを見てください。 filterそしてremoveあなたが求めるものです。

于 2009-06-02T13:24:49.883 に答える