我需要像this这样的东西,一个不包含任何元素副本的元素集合。Common Lisp,特别是SBCL,有这样的东西吗?
发布于 2008-10-03 07:51:12
要获得快速解决方案,只需使用哈希表,如前所述。
然而,如果你喜欢更有原则的方法,你可以看看FSet,它是一个“函数式集合论集合库”。其中,它包含集合和包的类和操作。
(EDIT:)最干净的方法可能是将面向集合的操作定义为泛型函数。毕竟,一组泛型函数基本上等同于一个Java接口。您可以简单地在标准散列表类上实现方法作为第一个原型,并允许其他实现。
发布于 2008-10-03 11:53:21
看看cl-containers吧。这里有一个set-container类。
发布于 2008-10-03 10:38:20
您可以使用列表,尽管它们在表示大型集合时可能被证明效率低下。这可以使用ADJOIN或PUSHNEW将新元素添加到列表中,使用DELETE or 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}需要注意的一件事是,默认情况下,这些操作符使用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"}Lisp相当于Java的一些Set操作,它们是:
SUBSETP
INTERSECTION or NINTERSECTION的
https://stackoverflow.com/questions/165767
复制相似问题