2009-06-02 5 views
32

まず、私は、各構造特異的配列は、アイテムを削除するさまざまな方法を持っているでしょう仮定します第2に、構造的に不可知論的な除去方法がいくつかあると仮定します。彼らはseqインターフェイスで動作します。Clojureでシーケンスからアイテムを削除するにはどうしたらいいですか?設定</em>を削除するために、実際のアイテムの通過しなければならない、<em>ベクトル</em>がインデックスによって可能性があり、<em>一覧</em>は、最初または最後の削除することができ<em>:

Clojureではシーケンスが不変なので、実際にやっていることは、元のアイテムがなくてもオリジナルの安価なコピーを作っていると思われます。これは、リストの理解が削除に使用できることを意味しますが、不必要に冗長になる可能性があります。

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

答えて

41

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]) 
+0

ありがとうブライアン、これは私が探していたものです。 Subvecについてのあなたの言及は、ドキュメントと一致していないようです: "開始から終了までのアイテムの永続的なベクトルを返します(終了しない場合は、デフォルトでcountベクトルになります)。" 「削除済み」アイテムを削除するために2つのサブベントコールを連結できることを意味しましたか? – rcampbell

+0

ええ、それは私が意味するものです。後見では、それは考慮するにはあまりにも不器用かもしれません。私はその投稿から削除します。 –

+0

O(1)時間で動作するので、['subvec'](http://clojuredocs.org/clojure_core/clojure.core/subvec)は、(ベクトルの場合は)言及する価値があります。 –

2

ブライアン・カーパーの答えの延長として。それはあなたが結果で何をしているのかによって異なります。結果セットをデータセット全体(つまり、それを印刷する)で作業したいものに渡す場合は、seqを作成してフィルターを使用するか、問題を緩やかに解決するために削除するのが慣例です。一方、さまざまな後の使用のために保存するようにデータ構造を変更している場合は、その上にseqを作成すると、そのデータ構造に特有の更新機能を使用する方が良い更新特性が失われます。

関連する問題