Scala集包含相同的元素,但sameElements()返回false
发布时间:2020-12-16 09:44:42 所属栏目:安全 来源:网络整理
导读:在通过Scala exercises on Iterables工作时,我遇到了以下奇怪的行为: val xs = Set(5,4,3,2,1)val ys = Set(1,5)xs sameElements ys // trueval xs = Set(3,3)xs sameElements ys // false - WAT?! 当然这些集合具有相同的元素,并且应该忽略排序;为什么这
在通过Scala
exercises on Iterables工作时,我遇到了以下奇怪的行为:
val xs = Set(5,4,3,2,1) val ys = Set(1,5) xs sameElements ys // true val xs = Set(3,3) xs sameElements ys // false - WAT?! 当然这些集合具有相同的元素,并且应该忽略排序;为什么这只能按照预期的那样工作呢? 解决方法
Scala集合库为少于5个值的集合提供专门的实现(参见
source)。这些实现的迭代器以添加它们的顺序返回元素,而不是用于较大集合的一致的基于哈希的排序。
此外,相同的元素(scaladoc)定义在Iterable上(它在IterableLike中实现 – 参见source);如果迭代器以相同的顺序返回相同的元素,则返回true。 所以尽管Set(1,3)和Set(3,1)应该是等价的,但它们的迭代器是不同的,因此相同的元素返回false。 这个行为是令人惊讶的,并且可以说是一个错误,因为它违反了一套Set的数学期望(但仅限于某些大小的Set!)。 作为I.K.在评论中指出,如果你只是比较集合,即Set(1,3)== Set(3,1),则工作正常。然而,相同的元素更为通用,因为它可以比较任何两个迭代的元素。例如,List(1,2,3)== Array(1,2,3)为false,但List(1,2,3)sameElements Array(1,2,3)为true。 我有submitted a fix的Scala exercises解释了这个问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |