2015-04-24 34 views
5

Ho un dizionario di Array Integer come di seguito:appiattire tutti i valori di più array a Swift

let numbers = [1: [2, 3], 4: [5, 6, 7], 8: [9]]

Quello che voglio davvero è un singolo array appiattita di tutti i valori (che a loro volta sono gli array) , in questo modo:

[2, 3, 5, 6, 7, 9]

Ora, io sono stato in grado di chiamare numbers.values.array per ottenere:

[[2, 3], [5, 6, 7], [9]]

Ma quello che sto cercando è di unire ulteriormente questi passi, appiattendoli.

Swift (1.1 o 1.2) offre un metodo conveniente per questo?

risposta

6

Un'altra possibile soluzione è

[].join(numbers.values) 

E se si desidera che i valori nell'ordine corrispondente al dizionario ordinato chiavi allora sarebbe

flatMap(sorted(numbers.keys)) { numbers[$0]! } 
+0

Anche se è ambiguo, suppongo che tu voglia ordinare l'array del valore finale, non ordinare i tasti del dizionario. Così ordinato (flatMap (numbers.keys) {numeri [$ 0]!}) Non importa, Vedo il tuo commento sopra. –

6

Con una combinazione di numbers.values.array e una funzione reduce è possibile semplificare questo in una riga di codice.

numbers.values.array.reduce([], combine: +) // [5,6,7,2,3,9] 

Tuttavia, vorrei sottolineare che, dal momento che si sta utilizzando un dizionario, non è possibile garantire che i valori verranno ordinati, in modo da poter utilizzare la funzione sorted per raggiungere questo obiettivo:

sorted(numbers.values.array.reduce([], combine: +), <) // [2,3,5,6,7,9] 

come ha affermato @Jeffery Thomas, è anche possibile utilizzare flatmap che è stato appena aggiunto a Swift 1.2:

sorted(numbers.values.array.flatMap { $0 }, <) 

E per fare un ulteriore passo avanti, utilizzando il globale sorted funzione, il < è estranea, perché è il difetto ed utilizzando i mondiali reduce e flatMap funzioni, è possibile rimuovere la proprietà array come sottolineato da Martin R, in modo che possa essere ridotta fino a:

sorted(reduce(numbers.values, [], +)) 
sorted(flatMap(numbers.values) { $0 }) 
5

Questo si chiama flattening ed è un'operazione relativamente comune. Ci sono diversi modi per farlo, quindi scegli quello più adatto alle tue esigenze.

numbers.values.array.reduce([], combine: +) // As stated by @Bluehound 
reduce(numbers.values, [], +) 
numbers.values.array.flatMap { $0 } // Swift 1.2 (Xcode 6.3) 
flatMap(numbers.values) { $0 } // Swift 1.2 (Xcode 6.3) 

flatMap può essere il più utile, se il prossimo passo dopo l'appiattimento è la mappatura.

NOTA: grazie a @MartinR per il suggerimento della sintassi.

+2

o 'flatMap (numbers.values) {$ 0} ', non hai bisogno della proprietà' array'. –

+0

@MartinR Grazie per il suggerimento, sia 'flatMap' che' reduce' possono essere passati 'numeri.valori'. –

Problemi correlati