当我引用数组中的某个项时,我希望找到与它最接近且符合特定条件(向前或向后)的另一项。
例如,我有这个数组:
let items = [
(a: "Item 1", b: "F", c: 3),
(a: "Item 2", b: "S", c: 5),
(a: "Item 3", b: "D", c: 7),
(a: "Item 4", b: "A", c: 9),
(a: "Item 5", b: "M", c: 11),
(a: "Item 6", b: "I", c: 13),
(a: "Item 7", b: "F", c: 15),
(a: "Item 8", b: "S", c: 17),
(a: "Item 9", b: "D", c: 19),
(a: "Item 10", b: "A", c: 21),
(a: "Item 11", b: "M", c: 23),
(a: "Item 12", b: "I", c: 13),
(a: "Item 13", b: "F", c: 15),
(a: "Item 14", b: "S", c: 17),
(a: "Item 15", b: "D", c: 19),
(a: "Item 16", b: "A", c: 21),
(a: "Item 17", b: "M", c: 23),
(a: "Item 18", b: "I", c: 13),
(a: "Item 19", b: "F", c: 15),
(a: "Item 20", b: "S", c: 17),
(a: "Item 21", b: "D", c: 19),
(a: "Item 22", b: "A", c: 21),
(a: "Item 23", b: "M", c: 23),
(a: "Item 24", b: "I", c: 13)
]
现在假设我有item[7]
,我如何找到最近的包含b = "I"
的项?我只能想到几个嵌套的for循环,但听起来很混乱,性能也不好。还要记住,我不希望在搜索时出现out of range
问题。关于如何处理这个问题,有什么类似Swift的想法吗?
6条答案
按热度按时间fv2wmkja1#
使用高阶函数的优化解决方案:
Swift的每一个版本都在不断改进,以优化性能和效率。使用高阶函数,在数组值中查找最接近的匹配会更容易。根据您的需要更改值的类型。
bfnvny8b2#
伪代码:
您可以轻松地将伪代码转换为Swift代码。
wi3ka0sx3#
下面是Array的一个泛型,它应该能完成你要找的任务。它返回一个元组,包含最接近匹配的索引和值:
owfi6suc4#
除了其他解决方案外,还有一个“一行程序”:
根据大卫Berry的回答:
**注:**从性能Angular 来看,大卫Berry的答案更好。
oyjwcjzk5#
此函数应在以下情况下工作:
如果没有其他匹配项或索引无效,则返回nil,否则返回该项。
它只是向后搜索,直到找到匹配项,然后向前搜索,直到找到匹配项,并返回最接近的项。
ohfgkhjo6#
最简单的方法是:
这并不是问题的完整答案,只是一个向前搜索的例子。在我发布后,我意识到它与问题不匹配,但我会把它作为一个部分例子。