【问题标题】:Compare objects and edit array [duplicate]比较对象并编辑数组[重复]
【发布时间】:2016-11-10 07:20:50
【问题描述】:

我想按特定属性创建唯一元素数组。

例如:

我有一组对象(人):

struct Person {
    var name: String?
    var secondName: String?

    init (name: String, secondName: String) {

        self.name = name
        self.secondName = secondName
    }
}

let person1 = Person(name: "name1", secondName: "secondName1")
let person2 = Person(name: "name2", secondName: "secondName2")
let person3 = Person(name: "name1", secondName: "secondName3")

let personsArray = [person1, person2, person3]

我想获得一个新数组,它将包含具有唯一名称的人员对象

类似 $0.name == $1.name

实现这一目标的最佳方法是什么?


结果应该是具有唯一名称的对象数组 param = [[person1, person3], [person2]]

【问题讨论】:

  • 您的“结果”毫无意义。如果三个人有“name1”而另外两个人有“name2”怎么办?现在你期望什么输出?

标签: ios swift


【解决方案1】:

这是我对您问题的个人解释

给定一个Person(s) 的数组,您希望输出几个字典,其中键是人名,值是具有该名称的人员列表 .

这是代码

let dict = persons.reduce([String:[Person]]()) { (dict, person) -> [String:[Person]] in
    var dict = dict
    dict[person.name] = (dict[person.name] ?? []) + [person]
    return dict
}

【讨论】:

  • 这是个好方法。我刚刚完成了一组代码,该代码创建了一个以 int 值作为值的字典,而不是 Persons 的数组。我认为拥有Persons 的数组会比仅计算它们的数量要好。
  • @Putz1103:是的,因为具有相同name 的2 个Person(s) 可能有不同的secondName(s)
【解决方案2】:

一种方法:您可以将它们一一添加到字典中,其中“名称”是键(考虑使用小写字母),“人员数组”是值。完成后,keys 数组将包含您所有唯一的“名称”值,每个键的值将是具有该“名称”的 Persons 数组。然后,您可以通过删除具有计数小于 2 的数组的任何键来“修剪”您的字典。

替代方案:按“名称”对数组进行排序,然后您可以轻松删除任何未出现两次的元素(如果一个元素与其相邻元素不匹配,则将其删除)。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2012-10-20
    • 2020-05-11
    • 2012-09-14
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多