首页 > 解决方案 > 根据范围序列测试序列中每个数字的最有效方法是什么?

问题描述

我有两个数组。第一个序列是双打列表。第二个是范围列表。序列和数组的长度总是相同的。测试第一个数组中的每个元素是否在第二个数组中相同索引的范围内的最有效方法是什么?

有没有一种有效的方法可以使用某种矩阵库来做到这一点?

我要实现的目标的片段:

let A: [Double] = [1, 2, 3, 4, 5]
let B: [Range] = [0..2, 1..3, 2..4, 5..6, 7..8]

// TODO: Test each item in A against the range in B at the same index
// e.g. (0..2).contains(1) && (1..3).contains(2) && ... so on

如果所有项目都匹配,我想以 True 结束,否则以 false 结束。我需要在循环中执行此测试,因此我想找到进行此比较的最有效方法。

标签: arraysswift

解决方案


我可能会做类似的事情:

func all(_ values: [Double], in ranges: [Range<Double>]) -> Bool {
    zip(values, ranges).allSatisfy { $1 ~= $0 }
}

因此

let values: [Double] = [1,4,3]
let ranges: [Range<Double>] = [
    0..<3,
    1..<5,
    2..<6
]

let result = all(values, in: ranges)

不要混淆这个问题,但我可能会使其通用,因为没有理由将其限制为特定类型或特定类型的范围:

func all<T, U: RangeExpression>(_ values: [T], in ranges: [U]) -> Bool where U.Bound == T {
    zip(ranges, values).allSatisfy(~=)
}

正如 Jessy 指出的那样,如果您将其翻转为使用zip(ranges, values),那么您可以使用allSatisfy(~=).


推荐阅读