2016-05-23 3 views
2

Скажем, у меня есть массив [4, 1, 8, 5] и другой массив, соответствующий каждому объекту в первом массиве, например [«Четыре», «Один», «Восьмерка», "5"]. Как я могу сортировать первый массив в порядке возрастания, а также перемещать соответствующий объект во втором массиве в тот же индекс в Swift?Сортировка массива и соответствующий массив

+3

Почему вы сохранение двух массивов в первую очередь, если они имеют взаимную зависимость? Почему бы не сделать словарь, например Key, равным 4, а значение - четыре? – NSNoob

+0

У меня есть один массив, который состоит из словарей JSON. У меня есть другой массив, который состоит из ints, вычисленных из значений в словарях JSON. Думаю, я мог бы выполнить вычисления, а затем добавить новый ключ в каждый словарь и отсортировать его. – raginggoat

ответ

0

Использование 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, должна быть быстрее и изящнее.

2

Не похоже лучшей практики, но это решит вашу проблему:

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) 

* Это является общим, следовательно, будет работать с любым типом и позволяют поставить условие

Смежные вопросы