Про сортировку массива с клоужером

playground
xcode
swift3

#1

Ребята, есть такой массив, к примеру, [2,5,1,2,7,5,8,3,2,1,1,5,1,9]
нужно сделать так, чтобы массив стал таким [1,1,1,1,2,5,2,7,5,8,2,3,5,9], т.е. все 1цы в начало сместить, а остальные элементы по очереди следования оставить как в изначальном, после 1ц. Интересует можно ли это сделать через метод sort и в клоужере {через $0} или через методы map, reduce или filter (как в копошилке было у Ивана). Т.е. не в лоб сортировку запустить, а именно через методы эти и таким способом. Спасибо.


#2

могу ошибаться, но может через while?
кстати, через $0 $1 и тп можно, да


#3
let arr = [2, 5, 1, 2, 7, 5, 8, 3, 2, 1, 1, 5, 1, 9]
print(arr.sorted{ a, b in a == 1 }) // [1, 1, 1, 1, 2, 5, 2, 7, 5, 8, 3, 2, 5, 9]

print(arr.filter{ $0 == 1 } + arr.filter{ $0 != 1 }) // [1, 1, 1, 1, 2, 5, 2, 7, 5, 8, 3, 2, 5, 9]

print(arr.reduce([[Int](), [Int]()], {
	p, c in
	var p = p
	p[c == 1 ? 0 : 1].append(c)
	return p
}).reduce([Int](), {
	return $0 + $1
})) // [1, 1, 1, 1, 2, 5, 2, 7, 5, 8, 3, 2, 5, 9]

через map не стал делать потому что map не для этого нужен


#4

ух ты, спасибо огромное, с reduce нужно разобраться, как-то с лету сложновато выглядит, но за остальное вообще спасибо. Ну и можно тогда сказать для чего map? Еще раз спасибо


#5

map модифицирует элементы, а не меняет их порядок или их количество


#6

понял, еще раз спасибо за помощь