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]
要求:
sub
是 superTrue
的子集,但不是 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
.
场景:
let superTrue = [1,2,3,3]
let superFalse = [1,2,3]
let sub = [2,3,3]
要求:
sub
是 superTrue
的子集,但不是 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
.