Индекс элемента в sorted()

Когда вы звоните

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

Вы можете получить доступ к двум исходным элементам для сравнения через $0 а также $1, Но как я могу определить индекс, откуда они были взяты из источника?

1 ответ

Решение

Вы могли бы перейти в sorted не набор элементов, а индексы элементов:

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

Или, если вам не нравится захватывать a и если вы хотите, чтобы сами элементы передавались в замыкание, вы можете передать последовательность пар индекса и элемента следующим образом:

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

Обратите внимание, что результатом будет массив (index,element) пары: [(3, be), (4, going), (0, hello), (1, i), (2, must)], Если вы хотите превратить это обратно только в элементы, вы можете сделать map(pairs) { $0.1 }

Кроме того, если вы выберете маршрут just-indexes и захотите позже превратить его в элементы, вы можете сделать это с помощью PermutationGenerator:

let values = PermutationGenerator(elements: a, indices: idxs)
println(" ".join(values)) // prints "be going hello i must"
Другие вопросы по тегам