加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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解释了这个问题。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读