如何根据不同的国家对 listOfFruits
进行过滤和排序,并将其存储到 listOfFilterAndSortedFruits 中?
例如:
如果我选择 Canada
和 listOfFruit
:["Cherries", "Peer", "Cherries", "Apple"]
和 listOfFilterAndSortedFruits
将是
var listOfFilterAndSortedFruits:[Fruit] = [
Fruit(name: "Cherries", taste: "Juicy"),
Fruit(name: "Peer", taste: "Sweat"),
Fruit(name: "Cherries", taste: "Juicy"),
Fruit(name: "Apple", taste: "Sweat")
]
class Fruit {
var name: String
var taste: String
init(name: String, taste: String) {
self.name = name
self.taste = taste
}
}
class Country {
var name: String
var listOfFruit: [String]
init(name: String, listOfFruit: [String]) {
self.name = name
self.listOfFruit = listOfFruit
}
}
var listOfFruits:[Fruit] = [
Fruit(name: "Apple", taste: "Sweat"),
Fruit(name: "Orange", taste: "Tart"),
Fruit(name: "Cherries", taste: "Juicy"),
Fruit(name: "Banana", taste: "Sweet"),
Fruit(name: "Carambola", taste: "Tart"),
Fruit(name: "Peer", taste: "Sweat"),
]
var listOfCountries:[Country] = [
Country(name: "USA", listOfFruit: ["Apple", "Orange", "Cherries"]),
Country(name: "Brazil", listOfFruit: ["Orange", "Banana", "Peer", "Carambola"]),
Country(name: "Canada", listOfFruit: ["Cherries", "Peer", "Cherries", "Apple"]),
]
let listOFFruitInCanada = ["Cherries", "Peer", "Cherries", "Apple"]
var listOfFilterAndSortedFruits = [Fruit]()
最佳答案
您正在使用一系列水果:
let listOfFruits = [
Fruit(name: "Apple", taste: "Sweet"),
Fruit(name: "Orange", taste: "Tart"),
Fruit(name: "Cherries", taste: "Juicy"),
Fruit(name: "Banana", taste: "Sweet"),
Fruit(name: "Carambola", taste: "Tart"),
Fruit(name: "Pear", taste: "Sweet"),
]
但这是一个低效的结构,因为任何时候你想在该数组中查找水果,你都必须扫描它们。
相反,您可以使用字典。
例如,您可以从 listOfFruits
创建一个:
let fruitDictionary = Dictionary(grouping: listOfFruits) { $0.name }
或者,如果此 listOfFruits
仅用于查找目的,您可能最初将其定义为字典,并绕过此“将数组转换为字典”步骤。
无论如何,给定一系列加拿大水果名称:
let listOfFruitNamesInCanada = ["Cherries", "Pear", "Cherries", "Apple"]
如果您想要相应的 Fruit
对象数组,您现在可以在字典中查找 Fruit
实例:
let listOfFruitsInCanada = listOfFruitNamesInCanada.compactMap { fruitDictionary[$0] }
结果:
[
[Fruit(name: "Cherries", taste: "Juicy")],
[Fruit(name: "Pear", taste: "Sweet")],
[Fruit(name: "Cherries", taste: "Juicy")],
[Fruit(name: "Apple", taste: "Sweet")]
]
关键的一点是,我没有使用 listOfFruits.first(where: ...)
扫描数组(因为必须重新扫描数组以查找我们的每个水果)正在搜索,结果复杂度为 O(n)
)。相反,我使用字典 fruitDictionary[...]
(在其中我们可以立即找到所需的 Fruit
对象,其中 O(1)
复杂性)。
不相关,但您可以考虑使用struct
类型:
struct Fruit {
let name: String
let taste: String
}
struct Country {
let name: String
let listOfFruit: [String]
}
如果您确实愿意,您可以使用 class
引用类型,但现在我们倾向于使用 struct
值类型。
关于arrays - 如何根据另一个数组对一个数组进行排序和过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56863102/