我有一个对象数组。每个对象都有一个名为title的属性,我想知道两个对象是否具有相同的标题。如何在swift中做到这一点?
答案 0 :(得分:2)
如果你想要与数组中另一个对象具有相同标题的对象列表,你可以这样做(假设title是一个字符串):
var titles = Set<String>()
let duplicates = array.filter{ !titles.insert($0.title).inserted }
// note: this only lists the second and subsequent element with a given title
如果你需要他们的索引,你可以这样做:
var titles = Set<String>()
let dupIndexes = array.enumerated()
.filter{ !titles.insert($1.title).inserted }
.map{$0.0}
如果您想要复制标题的所有对象(包括第一个),您可以像这样优化第一种方法:
var titles = Set<String>()
let dupTitles = Set(array.map{$0.title}.filter{!titles.insert($0).inserted})
let dupObjects = array.filter{dupTitles.contains($0.title)}
[编辑] Swift 4有一个新的Dictionary初始化程序,可用于此:
let dupObjects = Dictionary(grouping:array){$0.title}
.filter{$0.value.count > 1}
.flatMap{$0.value}
在所有情况下,如果.count的重复项,dupIndexes或dupObjects是&gt; 0如果你在数组中至少有一个重复
答案 1 :(得分:0)
我不知道如何专门为swift做这个,但一般来说你可以用数组中的任何字符串检查数组的每个字符串(就像排序算法一样)并且如果你发现字符串是相等的到另一个,你的数组中有一个双字符串
答案 2 :(得分:0)
let s = Set(arr.map{$0.title})
print("found duplicate title?", arr.count != s.count)
如果您的标题不符合Hashable协议,只需使用
即可let s1 = Set(arr1.map{"\($0.title)"})
print("found duplicate title?", arr1.count != s1.count)
答案 3 :(得分:0)
var duplicateArray: [String] = []
var storedArray: [String] = []
for text in array {
if storedArray.contains(text) {
dump(text + " is a duplicate")
dupliateArray.append(text)
}
storedArray.append(text)
}
答案 4 :(得分:0)
我会将它添加到标题中的一组字符串中 然后比较两者的计数,如果count相等则没有重复,如果set count less则表示有两个标题相等