Objects/values of any type are allowed as set elements. Within a Set,
every element is guaranteed to be unique (in the sense that no two
elements would compare positively with the===
operator)
我想知道是否可以使用用户定义的函数而不是===?例如,在确定集合中的2个元素是否“相等”时,如何使用~~而不是===.
我试图解决的问题是:集合A有一些名字和一些姓氏,但是所有小写和没有标点符号,而集合B有许多名字和姓氏以任何顺序混合,那里可能是名称附带的标点符号,可能是大写或小写.我想知道集合A中的人(表示为具有一个特定名字和姓氏的A的子集)是否出现在集合B中.在这种情况下,由于集合B中的字母大小写和标点符号,我不能使用=== .
如果我可以使用~~而不是===,那么问题就会简单得多,因为我只需要使用~~来确定A的子集是否也是B的子集.这类似于我之前提到的“置换匹配”问题.
非常感谢你 !
解决方法
对于使用此技术进行草率匹配的示例,我将在列表和IntStr集中搜索数字:
say 4 ∈ ("3","4"); # False,because the list doesn't contain the integer 4 say ("3","4").first(* == 4,:p).defined; # True say set("3","4").keys.first(* == 4,:p).defined; # True
您需要通过基准测试来了解这是否与以更传统的方式检查集合成员资格一样快.对于大型集合,传统方式应该更快,因为可以使用散列查找.在某些编程语言中,迭代比散列更快,直到列表变得非常大.
如果您不需要获取匹配元素,则可以使用联结,它将并行执行多个检查:
say so ("3","4").any() == 4; # True
您也可以使用联结进行子集测试,但由于这是一个O(m * n)操作(尽管是自动线程),因此在比较两个非常大的集合时不要期望高性能.
say so (2,3).all() == ('1','2','3').any(); # True say so (2,3,4).all() == ('1','3').any(); # False
我使用了列表而不是上面的集合,因为如果你没有使用标准的运算符/方法,则集合不提供速度或API优势.