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

时间:2019-07-17 22:45:06

标签: arrays swift struct contains string-comparison

我创建了一个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"]

如何列出自己可以喝的饮料清单?

1 个答案:

答案 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运行时提供的其他数据结构,以便您知道何时使用哪个。