【问题标题】:Count number of items in an array with a specific property value计算具有特定属性值的数组中的项目数
【发布时间】:2014-08-20 07:01:37
【问题描述】:

我有一个 Person() 类:

class Person : NSObject {

    var firstName : String
    var lastName : String
    var imageFor : UIImage?
    var isManager : Bool?

    init (firstName : String, lastName: String, isManager : Bool) {
        self.firstName = firstName
        self.lastName = lastName
        self.isManager = isManager
    }
}

我有一个 Person() 数组

var peopleArray = [Person]()

我要统计数组中有多少人有

 isManager: true

我觉得它在那里,但我找不到它,或者找不到搜索参数。

谢谢。

【问题讨论】:

    标签: ios arrays swift


    【解决方案1】:

    使用filter方法:

    let managersCount = peopleArray.filter { (person : Person) -> Bool in
        return person.isManager!
    }.count
    

    甚至更简单:

    let moreCount = peopleArray.filter{ $0.isManager! }.count
    

    【讨论】:

    • 效果很好。非常感谢!
    • 虽然这个解决方案工作正常,但必须说如果比较reduce(见我的回答)效率低下,因为它创建了一个新数组 - 但如果过滤后的数组本身是需要 而不仅仅是它的count 属性,那么这是正确的解决方案
    • @Antonio 实际上,过滤后的数组也非常方便,但这两种方法都非常有助于理解,而且你们对它们的解释比文档更好,效率更高。 :)
    【解决方案2】:

    您可以使用reduce,如下:

    let count = peopleArray.reduce(0, combine: { (count: Int, instance: Person) -> Int in
        return count + (instance.isManager! ? 1 : 0) }
    )
    

    或更紧凑的版本:

    let count = peopleArray.reduce(0) { $0 + ($1.isManager! ? 1 : 0) }
    

    reduce 将闭包(第二个参数)应用于数组的每个元素,传递为前一个元素获得的值(或初始值,即作为其第一个参数传递的 0 值)和当前元素数组元素。在闭包中,您返回 count 加零或一,具体取决于 isManager 属性是否为 true

    standard library reference 中有关 reducefilter 的更多信息

    【讨论】:

    • 谢谢!之前没遇到过reduce和filter,不胜感激。
    • peopleArray.reduce(0) { $0 + Int($1.isManager!) }
    【解决方案3】:

    ⚠️ count(where:) 在 Xcode 10.2 beta 4 中从 Swift 5 中移除。


    在 Swift 5 和 Xcode 10.2 beta 3 中,如果要计算数组中与给定谓词匹配的元素数,可以使用 Arraycount(where:) 方法。 count(where:) 有以下声明:

    func count(where predicate: (Element) throws -> Bool) rethrows -> Int
    

    返回序列中满足给定谓词的元素数。

    以下 Playground 示例代码展示了如何使用count(where:)

    struct Person {
        let name: String
        let isManager: Bool
    }
    
    let array = [
        Person(name: "Jane", isManager: true),
        Person(name: "Bob", isManager: false),
        Person(name: "Joe", isManager: true),
        Person(name: "Jill", isManager: true),
        Person(name: "Ted", isManager: false)
    ]
    
    let managerCount = array.count(where: { (person: Person) -> Bool in
        return person.isManager
    })
    // let managerCount = array.count { $0.isManager } // also works
            
    print(managerCount) // prints: 3
    

    【讨论】:

    • 非常好的新方法总结(已投票),无论如何,您可以在简单的结构而不是类上演示这一点。我也会从person.isManager == true 中删除== true
    • count(where:) 在 Xcode 10.2 beta 4 中已从 Swift 5 中删除,但它似乎从未返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    • 2013-06-06
    相关资源
    最近更新 更多