我创建了一个struct元素数组。这些结构包含一个字符串数组。我想检查这些字符串是否恰好在另一个字符串数组中。
我该怎么做或应该使用哪些工具?
我发现我可以使用一个名为“ 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"]
如何列出自己可以喝的饮料清单?
答案 0 :(得分:0)
使用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 { $0.content.isSubset(of: stock) }
使用集合代替“ for循环内部的for循环”的重要性在于性能。 Set使用内部哈希表以极快的方式查找项目。因此,对于列表中的N个项目和库存中的M个项目,查询的总体复杂度为O(N.logM)。
如果您使用for循环完成此操作,则其复杂度将为O(N.M),这可能会花费更长的时间并消耗更多的电池,具体取决于您拥有的物品数量。
但这并不意味着您应该始终使用集合。集有权衡。它们带来了性能,但其初始构造速度较慢,并且不支持重复项。仅在这样的特定情况下使用它们。切勿使用集合,因为它们“更快”,请在解决特定问题时使用它们。
我强烈建议您浏览一下Swift运行时提供的其他数据结构,以便您知道何时使用哪个。