swift - 为什么 Set#intersection 在传递序列而不是集合时表现不同?

标签 swift set sequence

我注意到一个应用程序中的一个奇怪错误,并将其缩小到一个令人惊讶的原因:如果您将一个序列传递给 Set#intersection,您会得到与传递一个 Set 不同的行为,即使两者都是 Set 数据结构的支持方法。

您可以在任何 Swift REPL 中验证:

  1> Set([3, 6, 0, 1, 5, 2, 4]).intersection([0, 1, 1, 2, 3, 4, 5])
$R0: Set<Int> = 7 values {
  [0] = 5
  [1] = 0
  [2] = 3
  [3] = 1
  [4] = 2
  [5] = 6
  [6] = 4
}
  2> Set([3, 6, 0, 1, 5, 2, 4]).intersection(Set([0, 1, 1, 2, 3, 4, 5]))
$R1: Set<Int> = 6 values {
  [0] = 1
  [1] = 5
  [2] = 0
  [3] = 4
  [4] = 2
  [5] = 3
}

这里的问题是第一个结果有一个额外的值,整数 6,即使传递给 intersection< 的序列中没有 6/。第二个结果是正确的——第一个是错误的。两次调用之间的唯一区别是第二次调用将其序列转换为 Set

我是疯了,还是这种意外行为?

最佳答案

我认为这是错误 SR-16061 .该报告显示了与您类似的意外行为,其中使用 intersectionSet 重载会产生正确的输出,但 Sequence 重载不会。

let s = Set("ae")

print("s: \(s)") // ["a", "e"]

let i = s.intersection("aa")
let j = s.intersection(Set("aa"))

print("i: \(i)") // ["a", "e"]
print("j: \(j)") // ["a"]

我试着稍微了解一下发生了什么。上一个commit修改 NativeSet.swift 中的 intersection 方法的时间是 2021 年 11 月。这与可以重现此错误的 Swift 版本的发布日期一致——就在 Swift 5.5 和 5.6 之间。据说此更改应该通过使用位集来加速 Set.intersection

关于swift - 为什么 Set#intersection 在传递序列而不是集合时表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72585663/

相关文章:

algorithm - 如何构造具有任何连续数字的唯一总和的正整数序列?

node.js - 如何对 firestore 集合执行聚合

java - 调用所有集合成员的删除方法

java - 如何生成通过从 Arraylist 中递归删除所有奇数索引元素创建的序列,以便我们最后只得到 1 个元素?

python - 正则表达式从文件名列表中查找图像序列

python - 我可以在 Python 中用什么替换 tuple(sorted(my_string))?

ios - ios 视频中图像位置的变化

ios - 如何在 NSUserDefaults 中设置数组的数组?

ios - 将光标放在 UITest 下 UITextView 的末尾

java - 简化集合中的唯一字符串检查