gpt4 book ai didi

swift - 枚举 swift 字符串时获取 "String.Index"

转载 作者:行者123 更新时间:2023-11-28 13:35:34 25 4
gpt4 key购买 nike

目前我们迭代字符串如下:

let greeting = "Hello"
for (intIndex, char) in greeting.enumerated() {
let currentIndex = greeting.index(greeting.startIndex, offsetBy: intIndex)
let indexAfterCurrentIndex = greeting.index(after: currentIndex)
print(greeting[indexAfterCurrentIndex...])
}

我觉得写下面的代码是多余的。

let currentIndex = greeting.index(greeting.startIndex, offsetBy: intIndex)

Is there other way to get directly "String.Index" while iterating?

像这样

let greeting = "Hello"
for (stringIndex, char) in greeting.enumeratedXXX() {
let indexAfterCurrentIndex = greeting.index(after: stringIndex)
print(greeting[indexAfterCurrentIndex...])
}

最佳答案

没有内置的功能。您可以将其包装在自定义迭代器中,但随后您只能将相同类型的计算封装在不同的地方,所以这不是答案:)

代码复杂度

但是,您可以提高当前代码的性能:

greeting.index(greeting.startIndex, offsetBy: intIndex)
  • 这将为每次循环迭代计算从 startIndex 到结果索引的索引。
  • 使用index(_:offsetBy:) 进行的索引计算实际上只是另一个循环本身,其中它+1 每个索引。没有O(1) 方法来“计算”索引;它是通过 O(n)
  • 中的循环找到的

所以你自己的外层循环是线性的,O(n) n 迭代,每个字符一个。

然后使用内部循环计算索引意味着有 1+2+3+4+5+6+...n = (n^2 + n)/2 迭代,其中n 是本例中的 intIndex

这意味着该算法的复杂度为 *handwaiving* roundabout O(n + n^2)。二次方部分有问题!

更好的方法

您可以将复杂度降低到每次迭代 2 个操作,或 O(2n)。只需将之前计算的索引保存在内存中并自己 +1,避免从头开始重新计算。

代码如下:

let greeting = "Hello"
var index = greeting.startIndex
for char in greeting {
let indexAfterCurrentIndex = greeting.index(after: index)
print(greeting[indexAfterCurrentIndex...])
index = indexAfterCurrentIndex
}

这仍然不是一个简单的内置解决方案,但您也可以封装这个更高效的算法,然后就可以开始了!

extension String {
func forEachCharacterWithIndex(iterator: (String.Index, Character) -> Void) {
var currIndex = self.startIndex
for char in self {
iterator(currIndex, char)
currIndex = self.index(after: currIndex)
}
}
}

let greeting = "Hello"
greeting.forEachCharacterWithIndex { (index, char) in
let indexAfterCurrentIndex = greeting.index(after: index)
print(greeting[indexAfterCurrentIndex...])
}

关于swift - 枚举 swift 字符串时获取 "String.Index",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56686820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com