2014-12-29 2 views
1

При вызовеИндекс элемента в отсортированный()

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

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

ответ

5

Вы могли бы пройти в 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 }

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

let values = PermutationGenerator(elements: a, indices: idxs) 
println(" ".join(values)) // prints "be going hello i must" 
+0

Спасибо, связка. Может быть, я догадался, что это так тривиально. Но, возможно, нет ;-) –

+1

Начиная с Xcode 7.3, PermutationGenerator отмечен как устаревший: * «PermitationGenerator будет удален в Swift 3» * (и опечатка не моя :) –

+1

Также упоминается здесь: https://github.com /apple/swift-evolution/blob/master/proposals/0006-apply-api-guidelines-to-the-standard-library.md: * "PermutationGenerator удален." * - Вы знаете, есть ли какая-то замена? –

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