swift 数组子集匹配重复元素

swift subset of array match the duplicate elements

场景:

let superTrue = [1,2,3,3]
let superFalse = [1,2,3]

let sub = [2,3,3]

要求:

subsuperTrue 的子集,但不是 superFalse.

错误代码:

print(Set(sub).isSubset(of: superTrue)) // true
print(Set(sub).isSubset(of: superFalse)) // true

因为 Set(sub)[2,3],删除重复的 3

不要删除重复项,并计算子集,有什么想法吗?

Set 将始终删除重复项。

其中一个选项是计算所有三个数组中所有元素的出现次数:

let subCounts = sub.reduce(into: [:]) { [=10=][, default: 0] += 1 }
let superTrueCounts = superTrue.reduce(into: [:]) { [=10=][, default: 0] += 1 }
let superFalseCounts = superFalse.reduce(into: [:]) { [=10=][, default: 0] += 1 }

然后检查想要的子数组的所有键的值是否等于或小于“超级”数组的相同键的值:

subCounts
  .keys
  .allSatisfy { subCounts[[=11=], default: 0] <= superTrueCounts[[=11=], default: 0] }
subCounts
  .keys
  .allSatisfy { subCounts[[=11=], default: 0] <= superFalseCounts[[=11=], default: 0] }

这将给出您期望的输出(据我对问题的理解)。

注意 1. 由于您最初尝试使用 Set,我假设顺序无关紧要,您只关心特定元素及其数量发生次数。

注2.元素应该是Equatable.