2016-08-28 13 views
1

n番目の要素をスワイプ配列から簡単に削除する方法はありますか?例えば、以下の配列で:スワイプアレイからn番目の要素をすべて削除します

thisArray = [2.0, 4.0, 3.0, 1.0, 4.5, 3.3, 1.2, 3.6, 10.3, 4.4, 2.0, 13.0] 

n = 3場合は最初の要素からのカウントを開始するには、返却したいと思います:

returnThis = [2.0, 4.0, 1.0, 4.5, 1.2, 3.6, 4.4, 2.0] 

答えて

2
// swift 3: 
thisArray.enumerated().flatMap { index, element in index % 3 == 2 ? nil : element } 
  • 使用.enumerated()がインデックスに
  • 次に添付しますflatMap()を使用して、インデックス2,5,8、...のアイテムをnilに戻して除外し、残りのインデックスをrで取り除くただelementとなっています。これを達成するための

(あなたはスウィフト2で立ち往生している場合は、代わりに.enumerated().enumerate()を使用しています。)

0

一つの方法は、このように、我々はよ、とりわけそれが配列からNILSを削除flatMapを使用することです

let n = 3 
let arr = [2.0, 4.0, 3.0, 1.0, 4.5, 3.3, 1.2, 3.6, 10.3, 4.4, 2.0, 13.0] 
let filteredArr = arr.enumerate().flatMap {$0.index % n == n - 1 ? nil : $0.element } 

を迅速3の場合:単に我々は削除するインデックスのnilを返す

let filteredArr = thisArray.enumerated().flatMap {$0.offset % n == n - 1 ? nil : $0.element } 

一般に、アレイのN-1要素を無視します。

以上の機能液は、ストライドを介して達成することができる。

let filteredArr = (n-1).stride(to: arr.count, by: n).flatMap { arr[($0-n+1)..<$0] } 

ここアプローチを濾別し、2つの連続した濾別インデックス間のスライスを結合するインデックスを得ることです。

以上に減らす何フィルタ/マップ/ flatMap実際にあるreduceを介して他のアプローチ、:

let filteredArr = arr.enumerate().reduce([]) { $1.0 % n == n - 1 ? $0 : $0 + [$1.1] } 
// or, both produce the same results 
let filteredArr = arr.reduce((0,[])) { ($0.0 + 1, $0.0 % n == n - 1 ? $0.1 : $0.1 + [$1]) }.1 

そしてません最後に、数学的なアプローチ:、配列のインデックスのセットを取るsubstract

let filteredArr = Set(0..<arr.count).subtract((n-1).stride(to: arr.count, by: n)).sort(<).map { arr[$0] } 
2

あなたはインデックスを調整することにより、古い 配列から直接、新しい配列を計算することができます。私たちは望んでいないインデックスは、結果のソート結果のインデックスから配列を構築しました。 n=3にとっては、次のようになります。

 
    0 1 2 3 4 5 6 7 8 ... old array index 
    | | // // 
    | | | | // 
    | | | |// 
    | |//// 
    0 1 2 3 4 5 6 ...  new array index 

コード:

let thisArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
let n = 3 

let newCount = thisArray.count - thisArray.count/n 
let newArray = (0..<newCount).map { thisArray[$0 + $0/(n - 1)] } 

print(newArray) // [1, 2, 4, 5, 7, 8, 10] 

古い配列 からn-1要素を取った後、あなたは一つの要素をスキップする必要があります。これは、マップクロージャの(新しい)配列インデックス$0$0/(n - 1) を追加することによって達成されます。

0

機能スタイルソリューションは、すでに私は昔ながらの方法でアプローチにここ

let nums = [2.0, 4.0, 3.0, 1.0, 4.5, 3.3, 1.2, 3.6, 10.3, 4.4, 2.0, 13.0] 

var filteredNums = [Double]() 
for elm in nums.enumerate() where elm.index % 3 != 2 { 
    filteredNums.append(elm.element) 
} 
を使用しています掲載されているので、
関連する問題