检查结构字符串数组是否包含另一个字符串数组的元素
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 的运行时提供的那些额外的数据结构,这样你就会知道使用哪个以及何时使用。
我创建了一个结构元素数组。这些结构包含一个字符串数组。我想检查这些字符串是否恰好在另一个字符串数组中。
我该怎么做或者我应该研究哪些工具?
我发现我可以使用一个名为 "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 的运行时提供的那些额外的数据结构,这样你就会知道使用哪个以及何时使用。