2015-04-24 9 views
5

Mam Dictionary tablic Integer jak poniżej:rozprostować wszystkie wartości wielu tablic w Swift

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

Co naprawdę chcę to pojedyncza spłaszczona tablicę wszystkich wartości (które same w sobie są tablice) , tak jak poniżej:

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

Teraz, byłem w stanie wywołać numbers.values.array dostać:

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

Ale to, czego szukam, to połączyć te kolejne kroki, spłaszczając je.

Czy Swift (1.1 lub 1.2) oferuje do tego wygodną metodę?

Odpowiedz

6

Innym możliwym rozwiązaniem jest

[].join(numbers.values) 

A jeśli chcesz wartości w kolejności odpowiadającej posortowane słowniku klucze wtedy byłoby

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

Chociaż jest niejednoznaczny, zakładam, że chcesz posortować końcową tablicę wartości, a nie posortować klucze słownika. Tak posortowane (flatMap (numbers.keys) {numbers [$ 0]!}) Nieważne, widzę twój komentarz powyżej. –

6

Dzięki kombinacji numbers.values.array i funkcji reduce można uprościć to w jednym wierszu kodu.

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

jednak chciałbym zauważyć, że skoro używasz słownika, nie można zagwarantować, że wartości będą sortowane, dzięki czemu można korzystać z funkcji sorted do wykonania tego:

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

jak stwierdzono @Jeffery Thomas, można również użyć flatmap który został dodany w Swift 1.2:

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

I wziąć go o krok dalej, wykorzystując globalny sorted no funkcjonuje < jest obce, ponieważ jest to domyślna i korzystania z globalnych reduce i flatMap funkcji można usunąć właściwość array jak podkreślił Martin R, dzięki czemu może być zmniejszona do:

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

This nazywa się flattening i jest to dość powszechna operacja. Istnieje wiele sposobów, aby to zrobić, więc wybierz taki, który odpowiada Twoim potrzebom.

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 może być najbardziej przydatne, jeżeli następny etap po spłaszczeniu jest odwzorowanie.

UWAGA: Dzięki @MartinR dla wskazówki składni.

+2

lub 'flatMap (numbers.values) {0 0} ', nie potrzebujesz właściwości' array'. –

+0

@MartinR Dzięki za napiwek, zarówno 'flatMap', jak i' reduce' mogą być przekazane 'numbers.values'. –

Powiązane problemy