arrays - 涉及数组和具有数组成员的对象的复杂过滤

标签 arrays swift filter filtering

我有两个数组

let badContents = ["b1", "b2"]
let things: [Thing] = ...

Thing 有自己的内容,像这样

print(things[0].contents)
// ["g1", "b1", "b2"]

我想做类似下面的事情,在那里我会得到一个 Thing 类型的数组,其元素的内容不与另一个数组重叠,badContents

func filteredThings() -> [Thing] {
    return things.filter({ (thing) -> Bool in {
        return // thing.contents and badContents do not share any elements
    }()
    })
}

因此,我会得到这样的结果

let things = [Thing(name: "1", contents: ["g1", "b2"), Thing(name: "2", contents: ["g1", "g2"])]

let goodThings = filteredThings() // removes Thing named "1" because its contents contain "b2"

for goodThing in goodThings {
    print(goodThing.name)
    // "2"
}

最佳答案

它可能对性能没有太大影响(除非 badThings 很大,或者 contents 都很大而且“坏事”很常见),但我' d 可能仍然这样做,而不需要任何新的扩展:

let badContents = Set(["b1", "b2"])

func filteredThings() -> [Thing] {
    return things.filter { $0.contents.first(where: { badContents.contains($0) }) == nil }
}

即使您继续靠近,当您发现碰撞时我也会停止搜索。找到所有的冲突然后检查 .count == 0 只是一种浪费,而且不是特别容易阅读。

或者,虽然在时间和空间上效率稍低,但以下 IMO 非常明确:

let badContents = Set(["b1", "b2"])

func filteredThings2() -> [Thing] {
    return things.filter { Set($0.contents).intersection(badContents).isEmpty }
}

关于arrays - 涉及数组和具有数组成员的对象的复杂过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732799/

相关文章:

Java 使用数组比 C++ 中的 std::vector 快 8 倍。我做错了什么?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

过滤包含大于 X.Y 的 float 的行

javascript - WordPress:了解基于 javascript 的后置过滤器

c++ - 查找输入数字以了解它在数组中的位置

c++ - 数组索引错误

ios - swift/OpenGL ES 2.0 - 从 YUV420 缓冲区创建纹理

swift - 如何通过ios中的cocoapods使用vendored框架发送dsym文件

ios - 将字符串转换为日期 swift3 ios10

filter - Google Sheets 组合骰子的公式