如果我有整数123,我想将数字分成数组[1,2,3]这样做的最佳方法是什么?我已经搞砸了很多,我有以下工作:
var number = 123
var digits = Array(String(number)).map{Int(strtoul((String($0)),nil,16))}
Run Code Online (Sandbox Code Playgroud)
我看着它,觉得可能有更好/更简单的方法.如果没有,那么它可能会出现在网络搜索上.任何替代想法?
更容易处理数字字符串的UTF-8表示,因为通过减去常数可以很容易地将十进制数字的UTF-8代码单位转换为相应的整数:
let asciiZero = UInt8(ascii: "0")
let digits = map(String(number).utf8) { Int($0 - asciiZero) }
Run Code Online (Sandbox Code Playgroud)
事实证明这也明显更快.
如果性能是主要目标,那么您应该将方法限制为简单的整数算术,而不使用字符串或字符:
var digits : [Int] = []
while number > 0 {
digits.insert(number % 10, atIndex: 0)
number /= 10
}
Run Code Online (Sandbox Code Playgroud)
为方便起见,这是我的完整测试代码(在MacBook Pro上以发布模式使用Xcode 6.4编译).
func digits1(number : Int) -> [Int] {
let digits = Array(String(number)).map{Int(strtoul((String($0)), nil, 16))}
return digits
}
func digits2(number : Int) -> [Int] {
// Use a static property so that the constant is initialized only once.
struct Statics {
static let asciiZero = UInt8(ascii: "0")
}
let digits = map(String(number).utf8) { Int($0 - Statics.asciiZero) }
return digits
}
func digits3(var number : Int) -> [Int] {
var digits : [Int] = []
while number > 0 {
digits.insert(number % 10, atIndex: 0)
number /= 10
}
return digits
}
func measure(converter: (Int)-> [Int]) {
let start = NSDate()
for n in 1 ... 1_000_000 {
let digits = converter(n)
}
let end = NSDate()
println(end.timeIntervalSinceDate(start))
}
measure(digits1) // 10.5 s
measure(digits2) // 1.5 s
measure(digits3) // 0.9 s
Run Code Online (Sandbox Code Playgroud)
Swift 3更新:
func digits(_ number: Int) -> [Int] {
var number = number
var digits: [Int] = []
while number > 0 {
digits.insert(number % 10, at: 0)
number /= 10
}
return digits
}
print(digits(12345678)) // [1, 2, 3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)
这也比将数字附加到数组并在最后反转它稍微快一些.
The*_*alk -1
我想说,如果它没有坏,就不要修理它。我可以用另一种方式,但它不会更短或任何东西:
var number = 123
var digits = map(String(number)) { String($0).toInt() ?? 0 }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3196 次 |
| 最近记录: |