什么是向后遍历字符串字符的好方法?

时间:2014-08-10 09:42:11

标签: swift

通过字符串中的字符向后迭代最常用的Swiftian方法是什么?即像for ch in str,只是反过来?

我认为我必须遗漏一些明显的东西,因为我刚才能想到的最好的是:

    for var index = str.endIndex; 
            index != str.startIndex; 
            index = index.predecessor() {
        let ch = str[index.predecessor()]
        ...
    }

我意识到“什么是最好的......”可能被归类为主观的;我想我真正想要的是一种简洁易读的方法。

编辑:虽然reverse()工作并且很简洁,但与上面相比,它看起来效率可能非常低,即看起来它实际上并不是向后迭代,而是在字符串中创建字符的完整反向副本。如果你正在寻找一些10,000字符字符串末尾通常是几个字符的东西,那么这比我原来的要糟糕得多。因此,我开放这个问题以吸引其他方法。

5 个答案:

答案 0 :(得分:23)

reversed功能会反转C: CollectionType并返回ReversedCollection

for char in "string".characters.reversed() {
  // ...
}

如果您发现reversed预翻转字符串,请尝试:

for char in "string".characters.lazy.reversed() {
  // ...
}

lazy返回一个延迟评估的序列(LazyBidirectionalCollection),然后reversed()返回反向访问的另一个LazyBidirectionalCollection

答案 1 :(得分:5)

截至2015年12月,使用Swift 2.1版,正确的方法是

for char in string.characters.reverse() {
    //loop backwards
}

字符串不再符合SequenceType<T>,但其字符集不符合。

答案 2 :(得分:4)

不确定效率,但我会建议

for ch in reverse(str) {
    println(ch)
}

答案 3 :(得分:1)

这是一个用于反转不使用reverse(str)

的字符串的代码
  // Reverse String

func myReverse(str:String) -> String {

    var buffer = ""

    for character in str {

        buffer.insert(character, atIndex: buffer.startIndex)
    }

    return buffer
}

myReverse("Paul")  // gives “luaP”

只是一个小实验。为了它的价值。

好的,想知道怎么读这个问题......

这会起作用吗?

func ReverseIteration(str:String) {

    func myReverse(str:String) -> String {

        var buffer = ""

        for character in str {

            buffer.insert(character, atIndex: buffer.startIndex)
        }

        return buffer
    }

    // reverse string then iterate forward.

    var newStr = myReverse(str)

    for char in newStr {

        println(char)
        // do some  code here

    }

答案 4 :(得分:-3)

此?

extension String {
    var reverse: String {
        var reverseStr = ""
        for character in self {
            reverseStr = String(character) + reverseStr
        }
        return reverseStr
    }
}