LoginSignup
0
1

More than 3 years have passed since last update.

[Swift]複数の要素を配列から削除する方法

Last updated at Posted at 2020-06-24

背景

SwiftとFirebaseを使ってマッチングアプリを作っていたところ、不正ユーザーをブロックする機能を実装する必要が出てきました。

そして、タイトルにもあるように、「配列から複数の要素を削除する方法」が必要になったのでその方法を自分なりに考えてみました。

方針

array1からarray2と重複する要素を除去します。

実際の環境では、自分以外の全ユーザーのドキュメントIDをDBから取得して配列(array1)とし、ブロックしたユーザーのドキュメントIDをDBから取得して配列(array2)として、array1からarray2の要素を除去することで、ブロックしていないユーザーのドキュメントIDからなる配列を取得します。

具体的な方法

var array1 = ["a","b","c","d","e","f"]
var array2 = ["a","d","e"]

var duplicateIndexs:[Int] = []

var count = 0

for i in 0..<array1.count {
    if array2.contains(array1[i]){
        duplicateIndexs.append(i)
    }
}

print(duplicateIndexs) // [0, 3, 4]

for i in 0..<duplicateIndexs.count{
    array1.remove(at: duplicateIndexs[i] - count)
    count += 1
}
print(array1) // ["b", "c", "f"]

補足

duplicateIndexsとか、countとかなんかごちゃごちゃやっているなという感じですが、
単に以下のコードだとIndex out of rangeのエラーが出ます。

var array1 = ["a","b","c","d","e","f"]
var array2 = ["a","d","e"]

for i in 0..<array1.count {
    if array2.contains(array1[i]){
        array1.remove(at: i)
    }
}
print(array1)

removeで除去しつつfor文を回しているので、array1が短くなっていき(要素が減っていき)、array1[i]の部分がIndex out of rangeになるんですね。

このエラーを避けるために、duplicateIndexsとか、countとか用意してなんとか目的の、array2の要素を除去した新たな配列を取得することに成功しました。

「もっと他にいい実装方法あるよ」という意見やアドバイスをいただけると幸いです!

0
1
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1