这里的问题涉及从数组中删除重复的对象:
相反,我需要删除一些对象,这些对象本身不是重复的,但具有特定的重复属性,比如id
。
我有一个包含Post
对象的数组。每个Post
都有一个id
属性。
有没有比在我的数组中查找重复的帖子ID更有效的方法
for post1 in posts {
for post2 in posts {
if post1.id == post2.id {
posts.removeObject(post2)
}
}
}
发布于 2016-01-11 02:20:31
我将提出两个解决方案。
这两种方法都需要Post
是Hashable
和Equatable
符合Hashable和Equatable的帖子
这里我假设您的Post
结构(或类)有一个String
类型的id
属性。
struct Post: Hashable, Equatable {
let id: String
var hashValue: Int { get { return id.hashValue } }
}
func ==(left:Post, right:Post) -> Bool {
return left.id == right.id
}
解决方案1(丢失原始订单)
要删除重复项,可以使用Set
let uniquePosts = Array(Set(posts))
解决方案2(保留顺序)
var alreadyThere = Set<Post>()
let uniquePosts = posts.flatMap { (post) -> Post? in
guard !alreadyThere.contains(post) else { return nil }
alreadyThere.insert(post)
return post
}
发布于 2019-10-01 17:50:29
你可以创建一个空数组"uniquePosts",然后循环你的数组"Posts“将元素追加到"uniquePosts”,每次追加时你都要检查是否已经追加了元素。
func removeDuplicateElements(post: [Post]) -> [Post] {
var uniquePosts = [Post]()
for post in posts {
if !uniquePosts.contains(where: {$0.postId == post.postId }) {
uniquePosts.append(post)
}
}
return uniquePosts
}
发布于 2020-10-27 05:33:51
保留原始顺序的通用解决方案是:
extension Array {
func unique(selector:(Element,Element)->Bool) -> Array<Element> {
return reduce(Array<Element>()){
if let last = $0.last {
return selector(last,$1) ? $0 : $0 + [$1]
} else {
return [$1]
}
}
}
}
let uniquePosts = posts.unique{$0.id == $1.id }
https://stackoverflow.com/questions/34709066
复制相似问题