获取数组中的唯一项

时间:2018-05-29 11:58:13

标签: ios swift

我有一个重复项目的数组,我想只获得独特的项目,所以我这样做了:

    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]

如何解决这个问题?

3 个答案:

答案 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
}