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]
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]
// swift 3:
thisArray.enumerated().flatMap { index, element in index % 3 == 2 ? nil : element }
.enumerated()
がインデックスにflatMap()
を使用して、インデックス2,5,8、...のアイテムをnil
に戻して除外し、残りのインデックスをrで取り除くただelement
となっています。これを達成するための(あなたはスウィフト2で立ち往生している場合は、代わりに.enumerated()
の.enumerate()
を使用しています。)
一つの方法は、このように、我々はよ、とりわけそれが配列から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] }
あなたはインデックスを調整することにより、古い 配列から直接、新しい配列を計算することができます。私たちは望んでいないインデックスは、結果のソート結果のインデックスから配列を構築しました。 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)
を追加することによって達成されます。
機能スタイルソリューションは、すでに私は昔ながらの方法でアプローチにここ
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)
}
を使用しています掲載されているので、