gpt4 book ai didi

ios - 过滤对象数组并在 Swift 中求和它们的属性

转载 作者:可可西里 更新时间:2023-11-01 01:35:26 24 4
gpt4 key购买 nike

我想从一系列产品中生成一个购物 list 。我在 Core Data 中有一个实体“Product”,它的属性是 name (String) 和 amount (Int)。我现在有一系列产品,其中有一些重复的产品,例如:

var products : [Product] = [Apple, Egg, Orange, Apple, Orange, Banana, Egg, Egg]

如何过滤此类数组以获得特定产品的总和?作为结果,我想获得产品列表及其数量:Apple:4,Banana:3,Egg:7,Orange 2。我知道我可以从该数组创建一个 Set 以避免重复,但我不知道如何在此之前对产品的数量求和。

最佳答案

enum Product {
case Apple
case Egg
case Orange
case Banana
}

let products: [Product] = [.Apple, .Egg, .Orange, .Apple, .Orange, .Banana, .Egg, .Egg]

products.reduce([:]) { (map, product) -> [Product: Int] in
var updatedMap = map
if let value = map[product] {
updatedMap[product] = value + 1
}
else {
updatedMap[product] = 1
}
return updatedMap
} //[Orange: 2, Apple: 2, Egg: 3, Banana: 1]

与字符串相同:

let products: [String] = ["Apple", "Egg", "Orange", "Apple", "Orange", "Banana", "Egg", "Egg"]

products.reduce([:]) { (map, product) -> [String: Int] in
var updatedMap = map
if let value = map[product] {
updatedMap[product] = value + 1
}
else {
updatedMap[product] = 1
}
return updatedMap
} // ["Apple": 2, "Egg": 3, "Orange": 2, "Banana": 1]

或者通过对所有可散列序列类型的扩展:

extension SequenceType where Generator.Element: Hashable {
func countElements() -> [Generator.Element : Int] {
return reduce([:]) { (map, element) -> [Generator.Element : Int] in
var updatedMap = map
if let value = map[element] {
updatedMap[element] = value + 1
}
else {
updatedMap[element] = 1
}
return updatedMap
}
}
}

products.countElements() //["Apple": 2, "Egg": 3, "Orange": 2, "Banana": 1]

关于ios - 过滤对象数组并在 Swift 中求和它们的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38391842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com