arrays - 如何根据另一个数组对一个数组进行排序和过滤?

标签 arrays swift sorting filter

如何根据不同的国家对 listOfFruits 进行过滤和排序,并将其存储到 listOfFilterAndSortedFruits 中?

例如: 如果我选择 CanadalistOfFruit:["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/

相关文章:

Java 向下移动数组元素

arrays - 如何将 byte slice 段 (&[u8]) 的缓冲区转换为整数?

c - 将数组中的元素更改为0-C编程

ios - 保存或更新核心数据后不更新表 - Swift

python - 找到双线;更快的方法

javascript - 尝试使用数组制作包含视频和图像的幻灯片,但图片不会显示

ios - 从 UICollectionViewCell 传播自定义事件

swift - 在 Swift REPL 中抑制值转储

搜索词间最短长度的算法

sorting - 我想使用轮廓检测​​对从图像中提取的单词按出现的顺序进行排序