Swift-比较单词和过滤

时间:2018-07-26 22:00:35

标签: ios swift

我刚刚开始学习Swift并尝试为iOS分配作业。

我所拥有的是4类关键字,例如:

CategoryX: hello, bye, good, bad
CategoryY: rain, sun
CategoryZ: sun, hello, what, rain
CategoryV: yes, no, bad, music, song, note

我想要的是将这些类别相互比较,结果将为我提供所选类别中的关键字。

例如,如果我选择比较所有类别,则结果将为:null (因为没有关键字显示在所有类别中)

但是如果我选择X和Z,那么结果将是:你好

如果Y和Z分别是:阳光,雨水

我并没有要求任何人给我写代码(但是,如果有人给我一个领先的机会,ofc会很好),我只想对如何处理这个问题以及如何正确使用它做一点解释方式,有人可以照亮吗?

谢谢

3 个答案:

答案 0 :(得分:6)

  

我并没有要求任何人给我写代码(但是,如果有人给我一个领先的机会,ofc会很好),我只想对如何处理这个问题以及如何正确使用它做一点解释方式,有人可以照亮吗?

好的,在没有给出答案的情况下,以下是有关如何解决问题的提示。

这个作业不是让您考虑集合吗?还记得您在高中时制作的维恩图吗?还记得集合的 intersection 的想法吗?考虑一下。考虑一下集合。嗯... Swift有一个Set结构...

如果您遵循该想法,并研究Swift中的Set,那么您将看到要做什么。

答案 1 :(得分:1)

编写它很有趣,所以我将其发布在这里。如果您现在还没有完成,请查看结果并从中学习(我的座右铭)。

我希望您学习.forEach,.map,.filter,Guard Let和可选下标,因为您跳过了Sets的简单答案。哦,别忘了闭包以及它们如何被强烈捕获。

func compare(dicts: [[String]]) -> [String] {
    var result = [String: Int]()
    dicts.forEach { arg0 in
        guard let priorResult = result[arg0.key] else {
            result[arg0.key] = arg0.value
            return
        }
        result[arg0.key] = priorResult + arg0.value
    }

    return result.filter{ arg0 in return arg0.value == dicts.count }.map{ return $0.key }
}

.map, forEach and .filter调用给定闭包中集合中的每个项目(字典中的每个键值对)。
.map返回map内部返回的数组。
.filter返回一个数组,闭包为其返回true,因此过滤掉该闭包返回false的元素。
.forEach是for循环的替代方法。

结果计算字符串的每次出现。
.filter对于每个字典中出现的字符串返回true。
.map将字典的键映射到简单的[String]数组。

答案 2 :(得分:0)

您可以尝试

let set1 = Set(["123","456","789"])
let set2 = Set(["123","456"])
let set3 = Set(["123"])
let res12 = set1.intersection(set2)  // ["123","456"]
let res123 = set1.intersection(set2).intersection(set3)  // ["123"]