2016-11-23 5 views
2

Ich versuche, ein Int-Array in eine Int Nummer zu konvertieren. Was ich jetzt mache, ist es in ein String Array zu konvertieren und dann die joined() Funktion zu verwenden. Gibt es einen effizienteren Weg, dies zu tun?Int-Array zu Int Standardmethode

Beispiel:

let sortedIntArray = String(number).characters.map{Int(String($0)) ?? 0}.sorted(by: { $0 > $1 }) 

let desOrder = Int(sortedIntArray.map{String($0)}.joined())! 

Antwort

7

In Ihrem Fall sortedIntArray ist ein Array von einem einstelligen Zahlen, und dann können Sie sie ohne Konvertierung in Strings kombinieren:

let sortedIntArray = [4, 2, 1] 
let result = sortedIntArray.reduce(0) { 10 * $0 + $1 } 
print(result) // 421 

In Kombination mit den dfri's elegant solution die Zahl in einen Integer-Array aufgeteilt:

let number = 1439 

let descDigits = sequence(state: number, next: { (num: inout Int) -> Int? in 
    return num > 0 ? (num % 10, num /= 10).0 : nil 
}).sorted(by: >) 
print(descDigits) // [9, 4, 3, 1] 

let descNumber = descDigits.reduce(0) { 10 * $0 + $1 } 
print(descNumber) // 9431 
1

Verwenden Sie die Methode reduzieren statt Karte und schloss

let desOrder = Int(sortedIntArray.reduce("") { $0 + String($1) }) 

reduce(intialResult: Result, (Result, Any) throws -> Result) rethrows

1

Sie über Effizienz gefragt, wie zu this answer by Martin R, ist meine Vermutung, dass die effizienteste Antwort

var number = 1992843 
var arr = [Int]() 

while number > 0 { 
    arr.append(number % 10) 
    number = number/10 
} 

arr.sort() 
arr.reverse() 

for n in arr { 
    number = number * 10 
    number += n 
} 
Verwandte Themen