Quantcast
Channel: 配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 757

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

$
0
0

背景

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の要素を除去した新たな配列を取得することに成功しました。

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


Viewing all articles
Browse latest Browse all 757

Trending Articles