【问题标题】:Sort complex array in swift快速排序复杂数组
【发布时间】:2018-11-14 12:27:06
【问题描述】:

我有一个这样的数组:

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

我想像这样对该数组进行排序:

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

谁能提供一些关于如何排序这个数组的提示或解决方案。

谢谢!

【问题讨论】:

  • 子数组中的所有元素是否相等?都是2的幂吗?他们排序了吗?子数组的长度是否相同?
  • 如果数组是[[[1,1],[9,9]],[4,4],[5,5]]] 怎么办?
  • 是否保证每个嵌套数组都包含一对相等的元素?
  • 你有喜欢的三层嵌套数组到底是为了什么?你能多解释一下你的问题吗?
  • 您将不得不将这些数组中的值移到其他数组中以...因为 2 和 8 在 1 个数组中,而 4 和 1 在不同的数组中,因此基于实际的数组只会准确地返回你已经拥有的东西。正如我怀疑其他人很快会建议的那样,这么多的嵌套是否有原因,你实际上试图解决/存储什么

标签: swift


【解决方案1】:

让我们从这个数组开始:

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]]]

从偶数和奇数索引处的元素创建对的更有效方法是使用this 美丽的扩展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]]]

【讨论】:

    猜你喜欢
    • 2013-04-26
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多