检查结构字符串数组是否包含另一个字符串数组的元素

Check if struct string array contains elements of another string array

我创建了一个结构元素数组。这些结构包含一个字符串数组。我想检查这些字符串是否恰好在另一个字符串数组中。

我该怎么做或者我应该研究哪些工具?

我发现我可以使用一个名为 "Set" 的命令,但它似乎不适用于结构中的数组。

import UIKit

// Define structure
struct Drink {
    var name: String
    var content: Array<String>
    var amount: Array<Int>
    var desc: String
}

// Define drinks
var mojito = Drink(name: "Mojito", content: ["Rum","Club soda"], amount: [4,20], desc: "Summer drink")
var vodkaJuice = Drink(name: "Vodka juice", content: ["Vodka","Juice"], amount: [4,20], desc: "Cheap alcohol")
var list = [mojito,vodkaJuice]

// Define what ingredients you have
var stock = ["Gin", "Vodka", "Juice", "Club soda"]

如何列出我可以用我现有的饮料制作的饮料?

使用 Set 而不是数组,这样您就可以简单地进行子集检查:

import UIKit

// Define structure
struct drink {
    var name : String
    var content : Set<String> // we use a Set instead
    var amount : Array<Int>
    var desc : String
}

// Define drinks
var mojito = drink(name: "Mojito", content: ["Rum","Club soda"], amount: [4,20], desc: "Summer drink")
var vodkaJuice = drink(name: "Vodka juice", content: ["Vodka","Juice"], amount: [4,20], desc: "Cheap alcohol")
var list = [mojito,vodkaJuice] 

// Define what ingredients you have
var stock = ["Gin", "Vodka", "Juice", "Club soda"]

// find all instances of drinks where their contents
// are subsets of what you have in stock
let drinks = list.filter { [=10=].content.isSubset(of: stock) }

使用集合而不是 "for-loops inside for-loops" 的重要性在于性能。 Set 使用内部散列 table 以极快的方式查找项目。因此,对于列表中的 N 项和库存中的 M 项,查找的总体复杂度为 O(N.logM)。

如果你用 for 循环完成它,它的复杂度将是 O(N.M),这可能需要更长的时间并消耗更多的电池,具体取决于你拥有的项目数量。

但这并不意味着您应该始终使用集合。集合有折衷。它们带来了性能,但它们的初始构建速度较慢并且不支持重复项。仅在此类特定情况下使用它们。永远不要使用集合,因为 "they are faster",当它们解决您的特定问题时使用它们。

我强烈建议浏览一下 Swift 的运行时提供的那些额外的数据结构,这样你就会知道使用哪个以及何时使用。