Break numbers to an array of individual digits

If I have an integer 123 and I want to split the numbers into an array [1,2,3], what is the best way to do this? I have mixed up a lot with this, and I have the following workers:

var number = 123    
var digits = Array(String(number)).map{Int(strtoul((String($0)),nil,16))}

I look at this and feel that there may be a better / easier way to do this. If not, it may appear in search engines. Any alternative ideas?

+4
source share
5 answers

It’s easier to work with the UTF-8 number line representation because the UTF-8 decimal digit code code can easily be converted to the corresponding integer by subtracting the constant:

let asciiZero = UInt8(ascii: "0")
let digits = map(String(number).utf8) { Int($0 - asciiZero) }

It also turned out to be significantly faster.

, , :

var digits : [Int] = []
while number > 0 {
    digits.insert(number % 10, atIndex: 0)
    number /= 10
}

( Xcode 6.4 Release MacBook Pro).

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

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]

, .

+7

Swift 2:

var x = 123
var digits = String(x).characters.map { Int(String($0))! } // [1,2,3]

, , .

+2

Swift 3 sequence(state:next:).

Swift 3.1

let number = 123456
let array = Array(sequence(state: number,
    next: { return $0 > 0 ? ($0 % 10, $0 = $0/10).0 : nil }
    ).reversed())

print(array) // [1, 2, 3, 4, 5, 6]

Swift 3.0

let number = 123456
let array = Array(sequence(state: number,
    next: { (num: inout Int) -> Int? in
        return num > 0 ? (num % 10, num /= 10).0 : nil
    }).reversed())

print(array) // [1, 2, 3, 4, 5, 6]

, , ([]) - number - 0. :

// -123 -> [1, 2, 3]
// 0    -> [0]
// 123  -> [1, 2, 3]

:

// for some number ...
let number = ...

// Swift 3.1
let array: [Int]
if number == 0 { array = [0] }
else {
    array =  Array(sequence(state: abs(number),
    next: { return $0 > 0 ? ($0 % 10, $0 = $0/10).0 : nil }
    ).reversed())
}

// Swift 3.0
let array: [Int]
if number == 0 { array = [0] }
else {
    array = Array(sequence(state: number,
    next: { (num: inout Int) -> Int? in
        return num > 0 ? (num % 10, num /= 10).0 : nil
    }).reversed())
}

, "() - , tuple ()", , , @MartinR answer. (Int, ()) state num; () -return "" .

defer return. I.e., return:

return num > 0 ? (num % 10, num /= 10).0 : nil

( " " )

return num > 0 ? { defer { num /= 10 }; return num % 10 }() : nil  

, , , sequence(state:next:) .


Swift 3.0 vs 3.1: next

- (Swift 3.1 ) , SR-1976 ( Swift 3 inout params), Swift inout . . Q & A :

state next Swift 3.0 , next Swift 3.1.

+2

, , , , map, , :) , , .

import Foundation

var number2 = 123
var number3 : String = "\(number2)"
var array : [String] = []
var str2 = ""
for i in number3.characters
{
    str2.append(i)
    var string = NSString(string: "str")
    string.doubleValue
    array.append(str2)
    str2 = ""
}

+1

, , . -, :

var number = 123
var digits = map(String(number)) { String($0).toInt() ?? 0 }
0

Source: https://habr.com/ru/post/1606636/


All Articles