2015-04-03 2 views
1

У меня есть несколько массивов, и я хочу, чтобы отсортировать все из них основан на упорядоченных одного из них, например, так:Как можно сортировать несколько массивов на основе упорядоченных другого массива

var myArr = ["b", "a", "c"] 
var myArr2 = ["letter b", "letter a", "letter c"] 
var myArr3 = ["b is the second letter", "a is the first letter", "c is the third letter"] 

func sortMultipleArraysBasedOnOne(alphabeticallyArray:Array, arrays:[Array]){ 
    //order myArr alphabetically 
    for array in arrays{ 
    //change all arrays indexes like in myArr 
    } 
} 

sortMultipleArraysBasedOnOne(myArr, [myArr2, myArr3]) 

Я ожидаю, что после выполнения функции массивы будет выглядеть следующим образом:

myArr = ["a", "b", "c"] 
myArr2 = ["letter a", "letter b", "letter c"] 
myArr3 = ["a is the first letter", "b is the second letter", "c is the third letter"] 

ответ

6

Вы можете сделать это первой сортировку массива индексов Прорезки массива по значениям они индексируют, а затем генерировать новые массивы на основе этих отсортированных показателей, используя PermutationGenerator:

let myArr = ["b", "a", "c"] 
let myArr2 = ["letter b", "letter a", "letter c"] 
let myArr3 = ["b is the second letter", "a is the first letter", "c is the third letter"] 

func sortByKeyArray(keyArray: [String], valuesArrays: [[String]]) -> [[String]] { 

    precondition(reduce(valuesArrays, true) { $0.0 && ($0.1.count == keyArray.count)}, 
     "Arrays all need to be the same length") 


    let permutation = sorted(indices(keyArray)) { 
     keyArray[$0] < keyArray[$1] 
    } 

    return valuesArrays.map { 
     Array(PermutationGenerator(elements: $0, indices: permutation)) 
    } 
} 

sortByKeyArray(myArr, [myArr2, myArr3]) 
// returns [["letter a", "letter b", "letter c"], ["a is the first letter", "b is the second letter", "c is the third letter"]] 

Если вы хотите сделать это родовое на любой коллекции (но все еще возвращая массив, в том же стиле, что и Algos станд коллекции ОМТ):

func sortByKeyingCollection<C: CollectionType, D: SequenceType 
    where D.Generator.Element == C, 
     C.Index: RandomAccessIndexType, 
     C.Generator.Element: Comparable> 
(key: C, values: D) -> [[C.Generator.Element]] { 

    let permutation = sorted(indices(key)) { 
     key[$0] < key[$1] 
    } 

    return map(values) { 
     Array(PermutationGenerator(elements: $0, indices: permutation)) 
    } 
} 

и версия который принимает произвольный компаратор:

func sortByKeyingCollection<C: CollectionType, D: SequenceType where D.Generator.Element == C, C.Index: RandomAccessIndexType>(key: C, values: D, isOrderedBefore: (C.Generator.Element,C.Generator.Element)->Bool) -> [[C.Generator.Element]] { 

    let permutation = sorted(indices(key)) { 
     isOrderedBefore(key[$0],key[$1]) 
    } 

    return map(values) { 
     Array(PermutationGenerator(elements: $0, indices: permutation)) 
    } 
} 


sortByKeyingCollection(myArr, [myArr2, myArr3], >) 
sortByKeyingCollection(myArr, [myArr2, myArr3], lexicographicalCompare) 
sortByKeyingCollection(myArr, [myArr2, myArr3]) { dropFirst($0) < dropFirst($1) } 
+0

Большое спасибо :) –

+0

Вы можете отредактировать его для Swift 2.1 с Int example 1,2,3? –

-1

Из чего я понимаю, вы хотите заказать массив по алфавиту. Если да, то можно использовать один из приведенного ниже примера:

Пример 1

var anArray1 = ["b","a","d","e","c"] 

func alphabeticallyOrder(lt : String, rt: String) -> Bool { 
    return lt < rt 
} 

anArray1 = sorted(anArray1, alphabeticallyOrder) 

println(anArray1) // [a, b, c, d, e] 

Пример 2

var anArray2 = ["b","a","d","e","c"] 

anArray2 = sorted(anArray2, {$0 < $1}) 

println(anArray2) // [a, b, c, d, e] 

Пример 3

var anArray3 = ["b","a","d","e","c"] 

anArray3 = sorted (anArray3 , <) 

println(anArray3) // [a, b, c, d, e] 

Редактировать: Мой плохой, вы также хотите изменить другие показатели массивов в процессе. При необходимости я отредактирую позже.

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