小智 5
您可以使用列表,但它们可能被证明对于表示大型集合效率低下.这是使用ADJOIN或PUSHNEW将新元素添加到列表中,并使用DELETE或REMOVE来执行相反操作.
(let ((set (list)))
(pushnew 11 set)
(pushnew 42 set)
(pushnew 11 set)
(print set) ; set={42,11}
(setq set (delete 42 set))
(print set)) ; set={11}
Run Code Online (Sandbox Code Playgroud)
需要注意的一件事是,这些操作符默认使用EQL来测试集合中的潜在重复项(就像Java使用equals方法一样).对于包含数字或字符的集合,这是可以的,但对于其他对象的集合,应该将诸如EQUAL之类的"更深层次"相等性测试指定为:TEST关键字参数,例如对于一组字符串: -
(let ((set (list)))
(pushnew "foo" set :test #'equal)
(pushnew "bar" set :test #'equal)
(pushnew "foo" set :test #'equal) ; EQUAL decides that "foo"="foo"
(print set)) ; set={"bar","foo"}
Run Code Online (Sandbox Code Playgroud)
Lisp与Java的一些Set操作的对应物是:
| 归档时间: |
|
| 查看次数: |
3522 次 |
| 最近记录: |