【问题标题】:Sorting an array and changed a second one using the sorting indices of the first [swift]使用第一个 [swift] 的排序索引对数组进行排序并更改第二个
【发布时间】:2015-03-12 22:43:07
【问题描述】:

我有两个数组 A 和 B。 我想知道根据 A 的排序索引对数组 A 进行排序和更改 B 的最有效实现是什么。

到目前为止,我已经解决了以下问题:

  var A = [5.0, 3.0, 7.0, 0.0, 2.0]
  var B = [3.0, 4.0, 5.0, 6.0, 7.0]
  var C = B
  let idxs = sorted(indices(A)) { A[$0] < A[$1] }
  println(idxs)
  for i in 0...A.count-1 {
    C[i] = B[idxs[i]]
  }
  println(C)

【问题讨论】:

    标签: ios arrays sorting swift


    【解决方案1】:

    您可以将两个数组压缩在一起并按第一项排序:

    var a = [5.0, 3.0, 7.0, 0.0, 2.0]
    var b = [3.0, 4.0, 5.0, 6.0, 7.0]
    var c = Array(zip(a, b)) // [(5.0, 3.0), (3.0, 4.0), (7.0, 5.0), (0.0, 6.0), (2.0, 7.0)]
    
    c.sort { $0.0 < $1.0 }   // [(0.0, 6.0), (2.0, 7.0), (3.0, 4.0), (5.0, 3.0), (7.0, 5.0)]
    

    【讨论】:

    • 这项工作可以压缩两个以上的数组吗?如何解压一切恢复正常?
    • 不,zip 适用于两个数组。显然,您可以手动创建包含两个以上元素的元组数组。您可以使用 map 解压缩数组,但这里的想法是尽可能将所有数组放在一起。
    • 我正在使用两个以上的数组。您的解决方案很好,但不适合我的问题。还是谢谢。
    【解决方案2】:

    这是我针对类似问题提出的解决方案:

    How to sort 1 array in Swift / Xcode and reorder multiple other arrays by the same keys changes

    var names = [ "Paul", "John", "David" ]
    var ages  = [  35,    42,     27 ]
    
    let newOrder = names.enumerate().sort({$0.1<$1.1}).map({$0.0})
    
    names = newOrder.map({names[$0]})
    ages  = newOrder.map({ages[$0]})
    

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 2016-11-05
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多