Swift:从字符串数组中删除任何包含另一个数组中字符串的元素

dm7nw8vv  于 2022-12-22  发布在  Swift
关注(0)|答案(1)|浏览(207)

我有一个array1,并过滤它,这样它的任何包含array2中任何字符串的元素都会被移除:

var array1 = ["first.food", "second.easy.good", "third.long.bad", "4.bad.apple", "cinco.Thank You!"]

let array2 = ["food", "bad"]

预期结果:array1 =["第二个。简单。好","cinco。谢谢!"]
我通过循环遍历array2并过滤array1来实现这一点,

for string in array2 {
        array1 = array1.filter { !$0.contains(string) }
    }

result:array1 =["第二个.容易.好","cinco.谢谢!"]
但它能在一条生产线上完成吗?如果能,效率会更高还是更低?
编辑:根据@matt已接受的答复,从问题中删除"功能"一词。
(上一个问题:但它能在一条生产线上完成功能吗?如果能,效率会更高还是更低?)

7ivaypg9

7ivaypg91#

功能上在一条线上...高效?
效率可能来自于将点串解析成一个集合,尤其是将第二个数组转换成一个集合,这样contains会更快;实际上,如果它们都是集合,则可以使用intersection,这非常高效。
这将是值得的,特别是如果数量很大,因为准备确实需要一点时间。

// your premise
let array1 = ["first.food", "second.easy.good", "third.long.bad", "4.bad.apple", "cinco.Thank You!"]
let array2 = ["food", "bad"]

// preparation
let parsedArray1 = array1.map {($0, Set($0.split(separator: ".").map(String.init)))}
let set2 = Set(array2)

// okay, _now_ we can be efficient!
let result = parsedArray1.filter { $0.1.intersection(set2).isEmpty }.map {$0.0}

// done! proof:
print(result) // ["second.easy.good", "cinco.Thank You!"]

但这与“函数式编程”“无关”,“函数式编程”只是一种说法,不是提高效率的方法,“行数”与效率也没有丝毫关系;一行程序(如我的let result行)看起来很有趣,但它对幕后发生的事情没有任何影响。

相关问题