下面的代码成功获取了收藏夹名称列表,并将其与较小的名称列表相匹配,并且在每次匹配或不匹配时,它会创建一个新的数据结构,指示它是否有利。 (但这似乎是(N ^ 2)复杂性)
listOfNames.forEach {
var faved = false
if namesFavorited.contains($0) {
faved = true
}
let model = DetailNameModel(name: $0, favorited: faved)
detailNameModelArray.append(model)
}
有没有更好的方法来做到这一点,可以SCALE到成千上万的人说N或NLogN?
答案 0 :(得分:1)
您可以使用Set
集合。它提供了与集合交互的有效方法。更多细节here。
更新代码:
let listOfNames: Set = ["name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8"]
let namesFavorited: Set = ["name2", "name3", "name5", "name6", "name8", "name9", "name10", "name11"]
let nonFav = listOfNames.subtracting(namesFavorited) // O(m*n)
let fav = listOfNames.intersection(namesFavorited) // O(m*n)
var detailNameModelArray: [DetailNameModel] = []
let nonFavDetailNames = nonFav.map { // O(nonFav.count)
DetailNameModel(name: $0, favorited: false)
}
detailNameModelArray.append(contentsOf: nonFavDetailNames)
let favDetailNames = fav.map { // O(fav.count)
DetailNameModel(name: $0, favorited: true)
}
detailNameModelArray.append(contentsOf: favDetailNames)
print(detailNameModelArray) // O(fav.count)
您可以生成大量数据并比较我的方法和您的方法。我认为我的方法会赢。