Function REMOVE-DUPLICATES
, DELETE-DUPLICATES
remove-duplicates
sequence &key from-end test test-not start end key
=> result-sequence
delete-duplicates
sequence &key from-end test test-not start end key
=> result-sequence
sequence - 正常なシーケンス
from-end - generalized-boolean、デフォルトはfalse
test - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
test-not - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
start, end - sequenceの境界インデックス指定子。 デフォルトはstart, endそれぞれ0
とnil
。
key - 1つの引数を取る関数の指定子、またはnil
result-sequence - シーケンス
remove-duplicates
は、 他の要素とマッチするような要素を削除した sequenceのコピーを返却します。
もしsequenceがvector
のとき、返却値はvector
であり、 sequenceと同じ実際の配列の要素の型を持ちます。 もしsequenceがリストなら、返却値はリストです。
sequenceの要素は対で比較され、 どれか2つが一致すれば、先に発生したものが捨てられます。 ただし,from-endがtrueの場合は、 後に発生したものが捨てられます。
remove-duplicates
とdelete-duplicates
は、 sequenceと同じ型のシーケンスに、 残りのどの2つの要素にもマッチしないように、 十分に要素取り除いた内容のものを返却します。 返却値に残った要素の順序は、sequenceに現れるものと同じです。
remove-duplicates
の返却値は、sequenceを共有するかもしれません。 もし要素に削除が生じなかったときは、 入力のsequenceと同一のものが返却される可能性があります。
delete-duplicates
は、sequenceがリストのときは、 sequenceのトップレベルのリスト構造の どのcar
, cdr
でもsetf
することが許されています。 もしsequenceがvector
のときは、 delete-duplicates
はvector
の次元を変更し、 その要素を並べ替えをせず、新しい位置にスライドして 返却値のvector
を構築することが許されています。
remove-duplicates "aBcDAbCd" :test #'char-equal :from-end t) => "aBcD"
(remove-duplicates '(a b c b d d e)) => (A C B D E)
(remove-duplicates '(a b c b d d e) :from-end t) => (A B C D E)
(remove-duplicates '((foo #\a) (bar #\%) (baz #\A))
(:test #'char-equal :key #'cadr) => ((BAR #\%) (BAZ #\A))
remove-duplicates '((foo #\a) (bar #\%) (baz #\A))
(:test #'char-equal :key #'cadr :from-end t) => ((FOO #\a) (BAR #\%))
setq tester (list 0 1 2 3 4 5 6))
(delete-duplicates tester :key #'oddp :start 1 :end 6) => (0 4 5 6) (
delete-duplicates
は、sequenceを破壊的に修正するかもしれません。
なし。
sequenceが正常なシーケンスでないとき、 型type-error
のエラーが発生します。
3.2.1. コンパイラーの用語, 3.6. 横断の規則と副作用
もしsequenceがvector
なら、 返却値はsimple
かもしれませんし、そうでないかもしれません。 また、返却値はsequenceと同一かもしれませんし、 そうでないかもしれません。
:test-not
パラメーターは非推奨です。
これらの関数は、sequenceを集合で表現される 標準形に変換するのに便利です。