我的罗马数字转换算法中有这段代码...
for (a, r) in arabicToRomanArray where substring.hasPrefix(r) {
arabic += a
let index = substring.index(substring.startIndex, offsetBy: r.characters.count)
substring = substring.substring(from: index)
break
}
我想知道是否有更简单的方法来做到这一点。
目前我正在执行一个条件 for 循环,然后在第一个条目处中断。有没有办法做for first
键入带有条件的 block ?
我能想到的唯一方法是过滤数组,然后从过滤后的数组中获取第一个对象并使用它。不过,看起来比我现在正在做的事情更笨拙。
编辑
尝试编辑后,它也会使算法变慢,这是有道理的。
for/break 循环的最佳时间为 O(1),最坏时间为 O(n)。
过滤器和第一个方法的最佳时间为 O(n)。
最佳答案
感谢@MartinR 的评论,我找到了一种更好的方法来完成同样的事情。
它在时间上与 for/break 循环相当,但不那么笨重。
我之前的代码...
for (a, r) in arabicToRomanArray where substring.hasPrefix(r) {
arabic += a
let index = substring.index(substring.startIndex, offsetBy: r.characters.count)
substring = substring.substring(from: index)
break
}
现在是...
let (a, r) = arabicToRomanArray[arabicToRomanArray.index(where:{string.hasPrefix($0.1)})!]
arabic += a
let index = substring(substring.startIndex, offsetBy: numCharacters)
substring = substring.substring(from: index)
使用数组函数...
array.index(where: (Element) -> Bool)
像...
arabicToRomanArray.index(where:{string.hasPrefix($0.1)})
完成此操作后,我还将一些代码重构为函数,所以现在实际上......
let (a, r) = findPrefixedArabicToRoman(string: substring)
arabic += a
substring = remove(numCharacters: r.characters.count, fromString: substring)
关于arrays - 数组中第一个对象的 Swift 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39311087/