背景
SwiftとFirebaseを使ってマッチングアプリを作っていたところ、不正ユーザーをブロックする機能を実装する必要が出てきました。
そして、タイトルにもあるように、「配列から複数の要素を削除する方法」が必要になったのでその方法を自分なりに考えてみました。
方針
array1からarray2と重複する要素を除去します。
実際の環境では、自分以外の全ユーザーのドキュメントIDをDBから取得して配列(array1)とし、ブロックしたユーザーのドキュメントIDをDBから取得して配列(array2)として、array1からarray2の要素を除去することで、ブロックしていないユーザーのドキュメントIDからなる配列を取得します。
具体的な方法
vararray1=["a","b","c","d","e","f"]vararray2=["a","d","e"]varduplicateIndexs:[Int]=[]varcount=0foriin0..<array1.count{ifarray2.contains(array1[i]){duplicateIndexs.append(i)}}print(duplicateIndexs)// [0, 3, 4]foriin0..<duplicateIndexs.count{array1.remove(at:duplicateIndexs[i]-count)count+=1}print(array1)// ["b", "c", "f"]
補足
duplicateIndexsとか、countとかなんかごちゃごちゃやっているなという感じですが、
単に以下のコードだとIndex out of rangeのエラーが出ます。
vararray1=["a","b","c","d","e","f"]vararray2=["a","d","e"]foriin0..<array1.count{ifarray2.contains(array1[i]){array1.remove(at:i)}}print(array1)
removeで除去しつつfor文を回しているので、array1が短くなっていき(要素が減っていき)、array1[i]の部分がIndex out of rangeになるんですね。
このエラーを避けるために、duplicateIndexsとか、countとか用意してなんとか目的の、array2の要素を除去した新たな配列を取得することに成功しました。
「もっと他にいい実装方法あるよ」という意見やアドバイスをいただけると幸いです!