2016-10-26 9 views
1

私は要素の配列を持っています。また、配列のどのインデックスを新しい配列に抽出する必要があるかを指定するIndexSetもあります。例えば:インデックスによる配列のフィルタ

let array = ["sun", "moon", "star", "meteor"] 
let indexSet: IndexSet = [2, 3] 
// Some magic happens here to get: 
let result = ["star", "meteor"] 

私は迅速filter機能を使用するために探していますが、まだ答えを持っていません。これどうやってするの?

答えて

9

IndexSetようenumeratedfiltermapが増加する整数の集合である使用することができますので、することができます マップ対応する配列要素への各インデックス:

let array = ["sun", "moon", "star", "meteor"] 
let indexSet: IndexSet = [2, 3] 

let result = indexSet.map { array[$0] } // Magic happening here! 
print(result) // ["star", "meteor"] 

これは、すべてのインデックスが指定された配列に対して有効であることを前提としています。 ことが保証されていない場合、あなたはインデックス (@dfriが正常に述べたように)フィルタリングすることができます:おそらく `IndexSet`における指標のどれもの上の要素、それらの配列の範囲外ではないことを確認してください

let result = indexSet.filteredIndexSet { $0 < array.count }.map { array[$0] } 
+1

を例えば、 '整数値インデックスの中間' Int'配列を使用していれば '.filter'となります)。 – dfri

+0

ブリリアント。ただ素晴らしい。 –

+0

'IndexSet'のインデックスはソートされているので、(配列リテラルではなく)' indexSet'に表示される順序は、 'array'に現れる順序と同じです;) – Hamish

0

あなたは、この

let result = array 
    .enumerated() 
    .filter { indexSet.contains($0.offset) } 
    .map { $0.element } 
関連する問題