1. ホーム
  2. data-structures

[解決済み] Clojureでリストが特定の値を含むかどうかをテストする

2022-04-29 02:11:04

質問

Clojureでリストが与えられた値を含むかどうかをテストする最良の方法は何ですか?

特に contains? は、現在私を混乱させています。

(contains? '(100 101 102) 101) => false

もちろん、リストを走査して等質性をテストする簡単な関数を書くこともできますが、これを行うための標準的な方法があるはずです。

どのように解決するのですか?

あ。 contains? Clojureに関するFAQのトップ5の1つと言われています。

それは ではない コレクションが値を含んでいるかどうかをチェックします。 get 言い換えれば、コレクションにキーが含まれているかどうかということである。これは、集合(キーと値の区別がないと考えることができる)、マップ(したがって (contains? {:foo 1} :foo)true ) とベクトル (ただし (contains? [:foo :bar] 0)true というのも、このキーはインデックスであり、問題のベクトルはインデックスを "含むからです。 0 !).

<ストライク さらに混乱を招いたのは、このように contains? を返すだけです。 false で起こることです。 (contains? :foo 1) また (contains? '(100 101 102) 101) . 更新してください。 Clojure ≥ 1.5 では contains? は、意図した "key membership" テストをサポートしない型のオブジェクトを渡したときにスローします。

あなたがやろうとしていることを正しく行うには、次のようにします。

; most of the time this works
(some #{101} '(100 101 102))

たくさんの項目の中から一つを検索する場合は、より大きなセットを使用することができます。 false / nil を使用することができます。 false? / nil? -- なぜなら (#{x} x) リターン x したがって (#{nil} nil)nil を検索する場合。 false または nil を使用することができます。

(some (zipmap [...the items...] (repeat true)) the-collection)

(ただし、項目は zipmap を任意のタイプのコレクションで使用することができます)。