How can I sort multiple arrays based on the sorted order of another array

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

I have multiple arrays, and I want to sort all of them based on the sorted order of one of them, like so:

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

I expect after function execution the arrays will be like this:

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

回答1:

You can do this by first sorting an array of the keying array’s indices by the values they index, then generating new arrays based on those sorted indices, using 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] 

If you want to make this generic on any kind of collection (but still returning an array, in the same style as the std lib collection algos):

func sortByKeyingCollection (key: C, values: D) -> [[C.Generator.Element]] {      let permutation = sorted(indices(key)) {         key[$0] 

And a version that takes a custom comparator:

func sortByKeyingCollection(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) 


回答2:

From what I understand, you want to order your array alphabetically. If so, you can use one of the example below :

Example 1

var anArray1 = ["b","a","d","e","c"]  func alphabeticallyOrder(lt : String, rt: String) -> Bool {     return lt 

Example 2

var anArray2 = ["b","a","d","e","c"]  anArray2 = sorted(anArray2, {$0 

Example 3

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

Edit : My bad, you also want to change the other arrays indexes in the process. I'll edit later if required.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!