首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Common Lisp是否有类似java的Set Interface/implementing类?

Common Lisp是否有类似java的Set Interface/implementing类?
EN

Stack Overflow用户
提问于 2008-10-03 05:17:01
回答 8查看 3.8K关注 0票数 9

我需要像this这样的东西,一个不包含任何元素副本的元素集合。Common Lisp,特别是SBCL,有这样的东西吗?

EN

回答 8

Stack Overflow用户

发布于 2008-10-03 07:51:12

要获得快速解决方案,只需使用哈希表,如前所述。

然而,如果你喜欢更有原则的方法,你可以看看FSet,它是一个“函数式集合论集合库”。其中,它包含集合和包的类和操作。

(EDIT:)最干净的方法可能是将面向集合的操作定义为泛型函数。毕竟,一组泛型函数基本上等同于一个Java接口。您可以简单地在标准散列表类上实现方法作为第一个原型,并允许其他实现。

票数 6
EN

Stack Overflow用户

发布于 2008-10-03 11:53:21

看看cl-containers吧。这里有一个set-container类。

票数 6
EN

Stack Overflow用户

发布于 2008-10-03 10:38:20

您可以使用列表,尽管它们在表示大型集合时可能被证明效率低下。这可以使用ADJOIN或PUSHNEW将新元素添加到列表中,使用DELETE or REMOVE执行相反的操作。

代码语言:javascript
复制
(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关键字参数,例如,对于一组字符串:-

代码语言:javascript
复制
(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

  • removeAll SET-DIFFERENCE or NSET-DIFFERENCE

  • retainAll INTERSECTION or NINTERSECTION

INTERSECTION or NINTERSECTION

  • addAll ->
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/165767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档