arrays - 根据范围序列测试序列中每个数字的最有效方法是什么?
问题描述
我有两个数组。第一个序列是双打列表。第二个是范围列表。序列和数组的长度总是相同的。测试第一个数组中的每个元素是否在第二个数组中相同索引的范围内的最有效方法是什么?
有没有一种有效的方法可以使用某种矩阵库来做到这一点?
我要实现的目标的片段:
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 结束。我需要在循环中执行此测试,因此我想找到进行此比较的最有效方法。
解决方案
我可能会做类似的事情:
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(~=)
.
推荐阅读
- linux - While循环性能:极慢
- node.js - Adding multiple Authorization to the same routes in nodejs, express and jwt
- c# - 如何在 WebAPI 中读取上传的文本文件中的流编码
- apache - 将子域重定向到主域
- sql - SELECT MAX() of Column, DATE Column and group by ID
- javascript - getElementsByClassName().classList.remove() 返回未定义
- laravel - 未捕获的 ReferenceError:未定义主页 - Laravel Vue.js
- automated-tests - 在单击下拉窗口中带有编辑或删除按钮的下拉窗口时出现问题
- php - 理解嵌套 PHP 三元运算符的问题?回声 $a ? 'a' : $b ? 'b' : 'c';
- javascript - Chart.js 更新到 X 轴未更新