gpt4 book ai didi

swift - 从两个数组中删除两个都不常见的值

转载 作者:搜寻专家 更新时间:2023-11-01 06:13:57 24 4
gpt4 key购买 nike

下面的代码有效,但我想知道是否有办法优化它。 if..else 语句有冗余代码。我对 array.reduce/array.map { } 还不够熟悉。

我有两个包含字符的数组。我想计算一个/两个数组中必要的删除次数,以便它们包含相同的字符。[“一”,“乙”][“a”、“b”、“c”、“d”、“e”]需要删除 3 次。

        var aArray = ["a", "b", "c"]
var bArray = ["a", "b", "c", "d", "e", "f", "g", "h"]
var newArray = [String]()

if aArray.count >= bArray.count {
for i in 0..<aArray.count {
if (bArray.contains(aArray[i])) {

newArray.append(aArray[i])
}
}
} else {
for i in 0..<bArray.count {
if (aArray.contains(bArray[i])) {

newArray.append(bArray[i])
}
}
}
print(newArray) // ["a", "b", "c"]
let count = (aArray.count + bArray.count) - (newArray.count * 2)
print(count) // 5

最佳答案

如果优化性能与其说是简洁是您的目标,则此方法可能会简洁地表达您想要的内容:

对于任何 Stringxs 的数组,我们可以将其简化为一个 Int 值,该值代表其元素的数量出现在另一个数组 ys 中,如下所示:

xs.reduce(0){ $0 + (ys.contains($1) ? 0 : 1) }

它所做的是将初始缩减值设置为 0(传递给上面的 reduce 方法的第一个参数)。

然后对于 xs 中的每个元素,它是否正在运行采用当前聚合/减少值的闭包(这也是传递给闭包的第一个参数,$0)如果正在检查的 xs 的当前元素 ($1) 包含在另一个数组 ys 中,则将 0 添加到值(它保持不变)。否则该元素不包含在另一个 ys 数组中,聚合/减少值增加 1。在这个 reduce 方法运行结束时,它将返回一个表示起始值 0 的值,每次 xs 中的元素不包含在 ys 中时递增 1。

要获得所需的总删除量,您只需运行相同的 reduce 方法,但对于 ys 相对于 xs 并添加结果每个一起减少。

因此对于您的示例代码:

var aArray = ["a", "b", "c"]
var bArray = ["a", "b", "c", "d", "e", "f", "g", "h"]
let totalDeletions = aArray.reduce(0){ $0 + (bArray.contains($1) ? 0 : 1) } + bArray.reduce(0){ $0 + (aArray.contains($1) ? 0 : 1) }
print(totalDeletions) //5

更进一步

如果你创建一个通用函数,它会为任何上下文(包括任何包含其他 Equatable String 之外的值),例如:

func incrementIfNotIn<T: Equatable>(_ otherArray:[T]) -> (Int, T) -> Int {
return { $0 + (otherArray.contains($1) ? 0 : 1) }
}

此函数接受任何 Equatable 类型(字符串、整数、 float 或其他任何类型)的数组,并返回一个接受 Int 的闭包(代表您的计数器value) 和数组包含的类型的元素,如果您指定的数组不包含该元素,则返回加一的 Int 值,如果包含则根本不增加。所以我们之前做过同样的事情,但是对任何 Equatable 类型的任何数组都是通用的

现在我们可以像这样编写您的示例代码:

var aArray = ["a", "b", "c"]
var bArray = ["a", "b", "c", "d", "e", "f", "g", "h"]
let totalDeletions = aArray.reduce(0, incrementIfNotIn(bArray)) + bArray.reduce(0, incrementIfNotIn(aArray))
print(totalDeletions) //5

或者像这样使用 Int 数组:

let aArray = [1, 3, 5, 6, 7]
let bArray = [1, 2, 4, 6, 9, 12, 13]
let totalDeletions = aArray.reduce(0, incrementIfNotIn(bArray)) + bArray.reduce(0, incrementIfNotIn(aArray))
print(totalDeletions) //8

我觉得它读起来更有表现力

关于swift - 从两个数组中删除两个都不常见的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49289232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com