Сортировать сложный массив в Swift - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть такой массив:

 array = [[[2,2],[8,8]],[[4,4],[1,1]]]

Я хочу отсортировать этот массив следующим образом:

sortedArray = [[[1,1],[2,2]],[[4,4],[8,8]]]

Может ли кто-нибудь дать подсказку или решение о том, как отсортировать этот массив.

Спасибо!

1 Ответ

0 голосов
/ 14 ноября 2018

Давайте начнем с этого массива:

let array = [[[2,2],[8,8]],[[4,4],[1,1]]]

Свести его и отсортировать по первому элементу каждого подмассива:

let flat = array.flatMap { $0 }
    .sorted { $0.first ?? 0 < $1.first ?? 0 }

Теперь нам нужно сгруппировать каждый элемент в четный индекс со следующим элементом:

let start = flat.startIndex
let end = flat.endIndex
let even = stride(from: start, to: end, by: 2).map { flat[$0] }
let odd = stride(from: flat.index(start, offsetBy: 1), to: end, by: 2).map { flat[$0] }
let zipped = zip(even, odd)
let newArray = zipped.map { [$0.0, $0.1]}

И теперь вы можете использовать результат:

print(newArray) //[[[1, 1], [2, 2]], [[4, 4], [8, 8]]]

Более эффективный способ создания пар из элементов с четными и нечетными индексами состоит в использовании этого красивого расширения matt :

extension Sequence {
    func clump(by clumpsize:Int) -> [[Element]] {
        let slices : [[Element]] = self.reduce(into:[]) {
            memo, cur in
            if memo.count == 0 {
                return memo.append([cur])
            }
            if memo.last!.count < clumpsize {
                memo.append(memo.removeLast() + [cur])
            } else {
                memo.append([cur])
            }
        }
        return slices
    }
}

И используйте это так:

let array = [[[2,2],[8,8]],[[4,4],[1,1]]]
let flat = array.flatMap { $0 }
    .sorted { $0.first ?? 0 < $1.first ?? 0 }
let newArray = flat.clump(by: 2)
print(newArray) //[[[1, 1], [2, 2]], [[4, 4], [8, 8]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...