Swift - 字符转换的有效数字

时间:2017-07-16 22:43:58

标签: swift performance data-conversion

如果我有一个很长的数字,例如1 ... 1000000,那么使用以下映射将它们转换为字符串的有效方法是什么?

1-> A,2-> B,3-> C,...... 10-> A0,11-> AA,12-> AB等。

我采用了将每个数字拆分为数字(使用模数)并使用它从数组中获取字符来构建字符串的方法。 1 ... 1000需要大约5秒钟。有更快的方法吗?

我的代码:

let numbers = 1...1000000
let charArray:[Character] = ["0","A","B","C","D","E","F","G","H","I"]
var results: [String] = []

func transformNumbers() {
    for number in numbers {
        var string = ""
        var i = number
        while i > 0 {string.insert(charArray[(i%10)], at: string.startIndex); i/=10}
        results.append(string)
    }
}

2 个答案:

答案 0 :(得分:0)

不确定它是否是最快的方式,但切换到map表达式而不是改变结果列表会使我的机器上的速度提高10倍以上:

let results = numbers.map { (val: Int) -> String in
    var string = ""
    var i = val
    while i > 0 {string.insert(charArray[(i%10)], at: string.startIndex); i/=10}
    return string
}

答案 1 :(得分:0)

我的旧MacBook上1...1000000的代码大约需要15秒,下面的代码不到1秒:

(在MacOS 10.12.5上使用Xcode 8.3.3 with Release build)

let unicodeScalarArray:[UnicodeScalar] = ["0","A","B","C","D","E","F","G","H","I"]
let utf16CodeUnitArray:[UInt16] = unicodeScalarArray.map{UInt16($0.value)}
var results: [String] = []

func transformNumbers7() {
    results = numbers.map {number in
        var digits: [UInt16] = []
        var i = number
        while i > 0 {digits.append(utf16CodeUnitArray[i%10]); i/=10}
        digits.reverse()
        return String(utf16CodeUnits: digits, count: digits.count)
    }
}

通常,

  • 重复insert(_:at:)可能比重复append(_:)reverse()
  • 使用Character可能效率低于UnicodeScalar,UTF-16代码单位或UTF-8代码单位。