我有一个重复项目的数组,我想只获得独特的项目,所以我这样做了:
let decoded = userDefaults.object(forKey: "shifts") as! Data
myShifts = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Shift]
filtered_shifts = myShifts.filter{$0.regionName == region && $0.cityName == city && $0.idService == idservice && $0.quantityStaff != 0}
for shift in filtered_shifts {
let decoded4 = userDefaults.object(forKey: "nationalities") as! Data
let decodedNationalities = NSKeyedUnarchiver.unarchiveObject(with: decoded4) as! [Nationality]
for nationality in decodedNationalities {
if nationality.id == shift.idNationality{
nationalitiesid.append(nationality.id)
nationalities.append(nationality.name)
}
}
}
uniqueNationality = Array(Set(nationalities))
uniqueNationalityid = Array(Set(nationalitiesid))
这让我得到了一个新的数组,其中包含我需要的独特项目......
问题是,当我想要相同的订单时订单是不同的......例如:
nationalitiesid = [3,3,3,3,3,3,3,3,4,4,4,4]
民族= [“印度人”,“印度人”,“印第安人”,“印第安人”,“印第安人”,“印第安人”,“印度人”,“印第安人”,“菲律宾人”,“菲律宾人”,“菲律宾人”, “菲”]
唯一数组是:
uniqueNationality = [“Indian”,“Philippines”]
uniqueNationalityid = [4,3]
这是错误的,因为印度身份证是3,菲律宾身份证是4!
它应该是:
uniqueNationalityid = [3,4]
如何解决这个问题?
答案 0 :(得分:3)
let uniqueList = nationalities.reduce([], {
$0.contains($1) ? $0 : $0 + [$1]
})
答案 1 :(得分:0)
这并没有直接回答这个问题。这是一种替代解决方案。使用模型对相关信息进行分组,而不是保持两个独立的数组同步。
有关Structs和Classes的更多信息,请查看documentation
struct Nationality {
var id: Int
var name: String
}
let nationalities = [
Nationality(id: 3, name: "Indian"),
Nationality(id: 4, name: "Philippines")
]
let randomNationalityIds = [3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4]
let nationalitiesResult = Set(randomNationalityIds).flatMap { id in
nationalities.filter({ id == $0.id }).first
}
print(nationalitiesResult)
输出:[__ lldb_expr_136.Nationality(id:4,name:“Philippines”),__ lldb_expr_136.Nationality(id:3,name:“Indian”)]
您无需按顺序保留这些内容,因为ID和名称位于同一位置。
答案 2 :(得分:0)
不是首先创建一个非唯一数组,然后将它减少为一个唯一数组,你也可以在Set
民族中收集国籍字符串:
var nationalitySet = Set<String>()
...
for nationality in decodedNationalities {
nationalitySet.append(nationality)
}
集合不会存储任何重复项,因此如果您添加已包含的国籍,则不会再次添加。
由于该集合是无序的,但将其转换为排序数组很容易:
let nationalities = nationalitiesSet.sorted { $0.name < $1.name }
但是,此解决方案确实需要Nationality
可以清除,i。即它必须符合Hashable
协议:
struct Nationality: Hashable {
var name: String
var id: Int
}