Scala Sets 包含相同的元素,但 SameElements() 返回 false

2024-03-15

在使用 Scala 进行工作时可迭代对象的练习 http://scala-exercises.47deg.com/koans#iterables,我遇到了以下奇怪的行为:

val xs = Set(5,4,3,2,1)
val ys = Set(1,2,3,4,5)
xs sameElements ys       // true

val xs = Set(3,2,1)
val ys = Set(1,2,3)
xs sameElements ys       // false - WAT?!

当然,这些集合具有相同的元素,并且应该忽略排序;为什么这仅适用于较大的集合?


Scala 集合库为少于 5 个值的 Sets 提供了专门的实现(请参阅source https://github.com/scala/scala/blob/v2.11.4/src/library/scala/collection/immutable/Set.scala#L1)。这些实现的迭代器返回元素按照添加顺序,而不是用于较大集合的一致的、基于哈希的排序。

此外,sameElements (scaladoc http://www.scala-lang.org/api/2.11.5/index.html#scala.collection.Iterable@sameElements%28that:scala.collection.GenIterable%5BA%5D%29:Boolean) 定义于Iterables(它是在IterableLike- 参见source https://github.com/scala/scala/blob/v2.11.5/src/library/scala/collection/IterableLike.scala#L1);仅当迭代器以相同顺序返回相同元素时,它才返回 true。

所以虽然Set(1,2,3) and Set(3,2,1) ought为了等价,它们的迭代器是不同的,因此sameElements返回假。

这种行为令人惊讶,并且可以说是一个错误,因为它违反了 Set 的数学期望(但仅限于 Set 的某些大小!)。

正如 I.K.在评论中指出,==如果您只是将集合彼此进行比较,则效果很好,即Set(1,2,3) == Set(3,2,1)。然而,sameElements 更通用,因为它可以比较任意两个可迭代的元素。例如,List(1, 2, 3) == Array(1, 2, 3)是假的,但是List(1, 2, 3) sameElements Array(1, 2, 3)是真的。

更一般地说,平等可能会令人困惑 - 请注意:

List(1,2,3) == Vector(1,2,3)
List(1,2,3) != Set(1,2,3)
List(1,2,3) != Array(1,2,3)      
Array(1,2,3) != Array(1,2,3)

I have 提交了修复 https://github.com/47deg/scala-exercises/issues/18为了斯卡拉练习 http://scala-exercises.47deg.com/koans#iterables这解释了sameElements问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala Sets 包含相同的元素,但 SameElements() 返回 false 的相关文章

  • 什么样的函数被认为是“可组合的”?

    维基百科文章函数组合 计算机科学 https en wikipedia org wiki Function composition computer science says 就像数学中通常的函数组合一样 每个函数的结果作为下一个函数的参数
  • 如何在 Scala 中编写 Pig UDF

    我正在尝试在 Scala 中编写 Pig UDF 使用 Eclipse 我已将 pig jar 添加为 java 构建路径中的库 这似乎解决了以下 2 个导入问题 导入 org apache pig EvalFunc 导入 org apac
  • 如何从spark管道逻辑模型中提取变量权重?

    我目前正在尝试学习 Spark Pipeline Spark 1 6 0 我将数据集 训练和测试 导入为 oas sql DataFrame 对象 执行以下代码后 生成的模型是oas ml tuning CrossValidatorMode
  • 如何设计具有相互依赖的测试的 Specs2 数据库测试?

    有没有一些首选的方法来设计Specs2 http etorreborre github com specs2 测试 有很多测试取决于之前测试的结果 下面 您将找到我当前的测试套件 我不喜欢var位于测试片段之间 不过 它们是 需要的 因为某
  • 在scala / play框架中构建Json文件

    我正在使用 Play 框架和 Scala 我需要提供一个如下所示的输入 id node37 name 3 7 data children 如何使用 json 获取该格式 以下是 Play 框架网站上的示例 val JsonObject Js
  • 如何将模型从 ML Pipeline 保存到 S3 或 HDFS?

    我正在尝试保存 ML Pipeline 生成的数千个模型 正如答案中所示here https stackoverflow com questions 32121046 run 3000 random forest models by gro
  • Scala 中抛出异常,什么是“官方规则”

    我正在 Coursera 上学习 Scala 课程 我也开始阅读 Odersky 的 Scala 书 我经常听到的是 在函数式语言中抛出异常不是一个好主意 因为它破坏了控制流 并且我们通常返回一个失败或成功的 Either Scala 2
  • 在 Akka/Scala 中使用带有 future 的 mapTo

    我最近开始使用 Akka Scala 编码 遇到了以下问题 通过范围内的隐式转换 例如 implicit def convertTypeAtoTypeX a TypeA TypeX TypeX just some kinda convers
  • 减少/折叠幺半群列表,但减少器返回任一

    我发现自己遇到过几次这样的情况 我有一个减速器 组合 fn 如下所示 def combiner a String b String Either String String a b asRight String 它是一个虚拟实现 但 fn
  • 如何从命令行向 REPL 添加导入?

    如何使 REPL 导入命令行中给出的包 Sample scala someMagicHere import sys error scala gt imports 1 import scala Predef 162 terms 78 are
  • Scala 的代码覆盖率工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Spark SQL 失败,因为“常量池已超过 JVM 限制 0xFFFF”

    我在 EMR 4 6 0 Spark 1 6 1 上运行此代码 val sqlContext SQLContext getOrCreate sc val inputRDD sqlContext read json input try inp
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez
  • 使用 net.liftweb.json 或 scala.util.parsing.json 解析大型 (30MB) JSON 文件会出现 OutOfMemoryException。有什么建议吗?

    我有一个包含大量测试数据的 JSON 文件 我想解析这些数据并推送我正在测试的算法 它的大小约为 30MB 包含大约 60 000 个元素的列表 我最初在 scala util parsing json 中尝试了简单的解析器 如下所示 im
  • Spark:如何使用crossJoin

    我有两个数据框 df1有 100000 行并且df2有 10000 行 我想创建一个df3这是两者的交叉连接 val df3 df1 crossJoin df2 这将产生 10 亿行 尝试在本地运行它 但似乎需要很长时间 您认为本地可以实现
  • Scala:什么是 CompactBuffer?

    我试图弄清楚 CompactBuffer 的含义 和迭代器一样吗 请解释其中的差异 根据 Spark 的文档 它是 ArrayBuffer 的替代方案 可以提供更好的性能 因为它分配的内存更少 以下是 CompactBuffer 类文档的摘
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 将 Tuple2 的值部分(即映射)合并为按 Tuple2 的键分组的单个映射

    我在 Scala 和 Spark 中这样做 我有和Dataset of Tuple2 as Dataset String Map String String 下面是值的示例Dataset A 1 gt 100 2 gt 200 3 gt 1
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客

随机推荐