当前位置:  开发笔记 > 编程语言 > 正文

Common Lisp有类似java的Set Interface /实现类吗?

如何解决《CommonLisp有类似java的SetInterface/实现类吗?》经验,为你挑选了4个好方法。

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



1> Matthias Ben..:

对于快速解决方案,只需使用哈希表,如前所述.

但是,如果您更喜欢更原则性的方法,可以查看FSet,它是"功能集理论集合库".其中,它包含集合和包的类和操作.

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



2> Jacek Szymań..:

看看cl-containers.有一个集合容器类.



3> 小智..:

您可以使用列表,但它们可能被证明对于表示大型集合效率低下.这是使用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}

需要注意的一件事是,这些操作符默认使用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操作的对应物是:

addAll - > UNION或 NUNION

containsAll - > SUBSETP

removeAll - > SET-DIFFERENCE或NSET-DIFFERENCE

retainAll - > INTERSECTION或NINTERSECTION



4> Matt Curtis..:

是的,它有一套.见的"设置"这一部分,从实用的Common Lisp.

基本上,你可以创建一组同pushnewadjoin,与查询它member,member-if并且member-if-not,与其他组有类似的功能结合起来intersection,union,set-difference,set-exclusive-orsubsetp.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有