我需要一个尽可能快的 lastIndexOf 实现。
我发现字符串提前功能非常慢。
我尝试使用 c 函数 strrchr,并尝试将字符串复制到 NSData 并使用指针,但我无法获得正确的语法。
我的字符串总是有 1 个字节的字符和我正在搜索的字符串“|”也总是 1 个字节。

任何使用 Advance 的实现都会太慢,但这是我能找到的最快的例子:

func indexOf(target: String, startIndex: Int) -> Int
{
    var startRange = advance(self.startIndex, startIndex)

    var range = self.rangeOfString(target, options: NSStringCompareOptions.LiteralSearch, range: Range<String.Index>(start: startRange, end: self.endIndex))

    if let range = range {
        return distance(self.startIndex, range.startIndex)
    } else {
        return -1
    }
}

func lastIndexOf(target: String) -> Int
{

    var index = -1
    var stepIndex = self.indexOf(target)
    while stepIndex > -1
    {
        index = stepIndex
        if stepIndex + target.length < self.length
        {
            stepIndex = indexOf(target, startIndex: stepIndex + target.length)
        }
        else
        {
            stepIndex = -1
        }
    }
    return index
}

这是我需要解析的字符串示例。
var str:String = "4|0|66|5|0|3259744|6352141|1|3259744|WSMxt208L54yZ5irtHC3|Mc02|efland,nc|36.027992|-79.2212834|0|34165|0|34165|3416 |14|1|0|7|7|3259744|6352141|4|1|0|8|8|3259744|6352141|4|0|22|9|0|3259744|6352141|2|3|房间1|2 |72|86330534|1|0|10|9|3259744|6352141|4|1|0|11|10|3259744|6352141|4|1|0|12|11|3259744|6352140|4| |13|12|3259744|6352141|4|0|4|14|0|3259744|6352141|46|24|0|5|15|0|3259744|6352141|46|654|0|66|0|0 |3259744|6352141|1|3259744|WSMxt208L54yZ5irtHC3|Mc02|efland,nc|36.027992|-79.2212834|0|4|16|0|3259741|634|3259741|635|3259741|64d|64d|64d|645 6352141|1|3259744|WSMxt208L54yZ5irtHC3|Mc02|efland,nc|36.027992|-79.2212834|0|4|6|0|3259744|6352141|47|37|27|37|7|2 |0|8|8|3259744|6352141|4|0|22|9|0|3259744|6352141|2|3|房间1|2|72|86330534|1|0|10|9|3259744|63452141| |1|0|11|10|3259744|6352141|4|1|0|12|11|3259744|6352141|4|1|0|13|12|3259744|6352141|4|0|4|14|0 |3259744|6352141|46|24|0|5|15|0|3259744|6352141|46|654|0|66|0|0|3259744|6352141|1|3259744|WSMxt208 Z5irtHC3|Mc02|efland,nc|36.027992|-79.2212834|0|4|16|0|3259744|6352141|46|4352141|1|3259744|WSMxt208L529t208L529t308L54ync|208L52308L52308L54ync|0|4|16|0|3259744 6|0|3259744|6352141|46|14|1|0|7|7|3259744|6352141|4|1|0|8|8|3259744|6352141|4|0|22|9|0|3259744| 6352141|2|3|房间1|2|72|86330534|1|0|10|9|3259744|6352141|4|1|0|11|10|3259744|6352141|4|1|0|12|11| 3259744|6352141|4|1|0|13|12|3259744|6352141|4|0|4|14|0|3259744|6352141|46|24|0|5|15|0|3259744|634 654|0|66|0|0|3259744|6352141|1|3259744|WSMxt208L54yZ5irtHC3|Mc02|efland,nc|36.027992|-79.2212834|0|45|44d|44d|44d|44d|44d|45|44d|44d|44d|44d|44d |0|66|5|0|3259744|6352141|1|3259744|WSMxt208L54yZ5irtHC3|Mc02|efland,nc|36.027992|-79.2212834|0|4|6|0|345|4|6|0|3416|416| 7|7|3259744|6352141|4|1|0|8|8|3259744|6352141|4|0|22|9|0|3259744|6352141|2|3|房间1|2|72|86330534|1 0|10|9|3259744|6352141|4|1|0|11|10|3259744|6352141|4|1|0|12|11|3259744|6352141|4|1|0|13|14|32597 6352141|4|0|4|14|0|3259744|6352141|46|24|0|5|15|0|3259744|6352141|46|654 |0|66|0|0|3259744|6352141|1|3259744|WSMxt208L54yZ5irtHC3|Mc02|efland,nc|36.027992|-79.2212834|0|4|16|047|144|16|13414416
4|0|66|5|0|3259744|6352141|1|3259744|WSMxt208L54yZ5irtHC3|Mc02|efland,nc|36.027992|-79.221283"

最佳答案

你可以在 Swift 中使用 strrchr

import Darwin

let str = "4|0|66|5|0|3259744|6352141|1|3259744"

func stringLastIndexOf(src:String, target:UnicodeScalar) -> Int? {
    let c = Int32(bitPattern: target.value)
    return src.withCString { s -> Int? in
        let pos = strrchr(s, c)
        return pos != nil ? pos - s : nil
    }
}

stringLastIndexOf(str, "|") // -> {Some 28}
stringLastIndexOf(str, ",") // -> nil

关于string - Swift 快速低级字符串 lastIndexOf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27570910/

10-09 21:38