gpt4 book ai didi

swift - 如何从 Swift 中的集合中获取所有唯一元素

转载 作者:搜寻专家 更新时间:2023-11-01 05:49:46 27 4
gpt4 key购买 nike

如果我得到这个数组:

[0, 0, 1, 1, 1, 2, 3, 4, 5, 5]

如何获得:

[2, 3, 4]

This answer将保留副本的值,但我也想删除该值。

最佳答案

请注意,您需要导入 Foundation 才能使用 NSCountedSet。如果您需要一个纯 Swift 解决方案来查找集合中的唯一元素,您可以扩展它,将元素限制为 Equatable 协议(protocol),并检查您是否可以再次找到元素索引,检查索引(的: element) == nil 使用 index(after:) 元素索引作为集合子序列的 startIndex:

编辑/更新:Swift 4.2.1

请注意,扩展 RangeReplacebleCollection 它将覆盖 StringProtocol 类型 StringSubstring:

将元素约束为 Equatable

Xcode 11 • Swift 5.1

extension RangeReplaceableCollection where Element: Equatable {
var uniqueElements: Self {
filter { self[index(after: firstIndex(of: $0)!)...].firstIndex(of: $0) == nil }
}
mutating func removeAllNonUniqueElements() { self = uniqueElements }
}

如果您不需要保持集合的原始顺序,您可以利用新的 Dictionary 初始化程序,但这需要将元素限制为 Hashable:

init<S>(grouping values: S, by keyForValue: (S.Element) throws -> Dictionary<Key, Value>.Key) rethrows where Value == [S.Element], S : Sequence

并保留值等于 1 的键

extension RangeReplaceableCollection where Element: Hashable {
var uniqueElementsSet: Set<Element> {
Set(Dictionary(grouping: self, by: { $0 }).compactMap{ $1.count == 1 ? $0 : nil })
}
}

Playground 测试

let numbers = [0, 0, 1, 1, 1, 2, 3, 4, 5, 5]
numbers.uniqueElements // [4, 2, 3]

如果您需要保持集合的顺序,您可以获得元素频率,如 answer 所示。并过滤独特的元素:

extension Sequence where Element: Hashable {
var frequency: [Element: Int] { reduce(into: [:]) { $0[$1, default: 0] += 1 } }
}

extension RangeReplaceableCollection where Element: Hashable {
var uniqueElements: Self { filter { frequency[$0] == 1 } }
mutating func removeAllNonUniqueElements() { self = uniqueElements }
}

Playground 测试

let numbers = [0, 0, 1, 1, 1, 2, 3, 4, 5, 5]
numbers.uniqueElements // [2, 3, 4]

var string = "0011123455"
string.uniqueElements // "234"
string.uniqueElementsSet // {"4", "3", "2"}
print(string) // "0011123455\n"

// mutating the string
string.removeAllNonUniqueElements()
print(string) // 234

关于swift - 如何从 Swift 中的集合中获取所有唯一元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46373836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com