Index of element in sorted()

后端 未结 1 893
梦毁少年i
梦毁少年i 2021-01-25 13:00

When you call

sorted(<#source: C#>, <#isOrderedBefore: (C.Generator.Element, C.Generator.Element) -> Bool##(C.Generator.Element, C.Generator.Element         


        
相关标签:
1条回答
  • 2021-01-25 13:23

    You could pass into sorted not a collection of elements, but the indices of the elements:

    let a = ["hello","i","must","be","going"]
    let idxs = sorted(indices(a)) { a[$0] < a[$1] }
    // produces [3, 4, 0, 1, 2]
    

    Or, if you don't like capturing a and wanted the elements themselves passed into the closure, you could pass in a sequence of pairs of the index and the element, like so:

    let pairs = sorted(Zip2(indices(a),a)) {
        $0.1 < $1.1
    }
    

    Note the result would be an array of (index,element) pairs: [(3, be), (4, going), (0, hello), (1, i), (2, must)]. If you wanted to turn that back into just the elements, you can do map(pairs) { $0.1 }

    Also, if you take the just-indices route and want to turn that back into elements later, you can do it with PermutationGenerator:

    let values = PermutationGenerator(elements: a, indices: idxs)
    println(" ".join(values)) // prints "be going hello i must"
    
    0 讨论(0)
提交回复
热议问题