【问题标题】:Sort Array and a Corresponding Array [duplicate]排序数组和相应的数组[重复]
【发布时间】:2016-09-20 07:03:24
【问题描述】:

假设我有一个数组 [4, 1, 8, 5] 和另一个数组,它对应于第一个数组中的每个对象,比如 ["Four", "One", "Eight", "Five"]。如何按升序对第一个数组进行排序,同时将第二个数组中的相应对象移动到 Swift 中的相同索引?

【问题讨论】:

  • 如果两个数组相互依赖,为什么要维护它们?为什么不做一个像 Key 是 4 而 value 是四的字典呢?
  • 我有一个数组,其中包含来自 JSON 的字典。我有另一个数组,它由从 JSON 字典中的值计算的整数组成。我想我可以进行计算,然后为每个字典添加一个新键并按这种方式排序。

标签: arrays swift sorting


【解决方案1】:

听起来不像是最佳做法,但这会解决您的问题:

var numbers = [4,7,8,3]
var numbersString = ["Four","Seven","Eight","Three"]

func bubbleSort<T,Y>(inout numbers:[T],inout _ mirrorArray: [Y], _ comapre : (T,T)->(Bool)) -> () {
    let numbersLength = numbers.count

    for i in 0 ..< numbersLength {
        for j in 1 ..< numbersLength-i {
            if comapre(numbers[j-1],numbers[j]) {
                swap(&numbers[j-1], &numbers[j])
                swap(&mirrorArray[j-1], &mirrorArray[j])
            }
        }
    }
}

bubbleSort(&numbers,&numbersString) { (a, b) -> (Bool) in
    a<b
}
print(numbers,numbersString)

*这是通用的,因此适用于任何类型并让您提供条件

【讨论】:

    【解决方案2】:

    使用quick sort

    func quicksort_swift(inout a:[Int], inout b:[String], start:Int, end:Int) {
      if (end - start < 2){
        return
      }
      let p = a[start + (end - start)/2]
      var l = start
      var r = end - 1
      while (l <= r){
        if (a[l] < p){
          l += 1
          continue
        }
        if (a[r] > p){
          r -= 1
          continue
        }
        let t  = a[l]
        let t1 = b[l]
        a[l] = a[r]
        b[l] = b[r]
        a[r] = t
        b[r] = t1
        l += 1
        r -= 1
      }
      quicksort_swift(&a, b: &b, start: start, end: r + 1)
      quicksort_swift(&a, b: &b, start: r + 1, end: end)
    }
    

    虽然@NSNoob 提供的字典解决方案应该更快更优雅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      相关资源
      最近更新 更多