質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

4210閲覧

2つの配列に共通している値があるかどうかを判断する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2020/05/05 23:41

編集2020/05/07 04:26

いつもお世話になります。

2つの配列に共通している値があるかどうかを判断する簡潔な方法をご存知でしたら教えて下さい。

Setに変換して共通要素があるかどうかを判断しようと思っていたのですが、Boolのみ必要ですので
Setに変換するまでもないような気がして、しっくり来ません。なにか簡単な方法はありませんか?

swift

1 2let indexPaths: [IndexPath] = [IndexPath(row: 0, section: 0)] 3 4func existsCommonElement() -> Bool { 5 guard let selectedRowsIndexPaths 6 = tableView.indexPathForSelectedRows else { return false } 7 8 // ここでindexPathsとselectedRowsIndexPathsに共通の要素がある場合はtrueを返したい。 9 // Boolのみ必要で、その他の要素は必要がないのでsetに変換するまでもないような? 10   11} 12

エラーがでます

swift

1 2// 面倒なので[int]で、 3let indexPaths = [1, 2, 3, 4] 4let selectedRowsIndexPaths = [6, 7, 8, 9] 5 6 7func hoge() -> Bool { 8 indexPaths.forEach{ 9 if selectedRowsIndexPaths.contains($0) { 10 return true // <= error / Unexpected non-void return value in void function 11 } 12 } 13 return false 14}

swift

1let aArray_nilAble: [Int]? = [Int](0...100) 2let bArray = [Int](200...300) 3 4func hoge() -> Bool { 5 6 guard let aArray = aArray_nilAble else { return false } 7 8 return !aArray.filter(bArray.contains).isEmpty 9 10 // 重複あり[(0...100)-(50...150)]: 0.22072505950927734 11 // 重複なし[(0...100)-(200...300)]: 0.30579400062561035 12} 13 14func fuga() -> Bool { 15 16 guard let aArray = aArray_nilAble else { return false } 17 18 return aArray.contains(where: bArray.contains) 19 20 // 重複あり[(0...100)-(50...150)]: 0.1724480390548706 21 // 重複なし[(0...100)-(200...300)]: 0.3085750341415405 22} 23 24func piyo() -> Bool { 25 26 guard let aArray = aArray_nilAble else { return false } 27 let aSet = Set(aArray) 28 let bSet = Set(bArray) 29 30 return !(aSet.isDisjoint(with: bSet)) 31 32 // 重複あり[(0...100)-(50...150)]: 0.17476892471313477 33 // 重複なし[(0...100)-(200...300)]: 0.1812349557876587 34} 35 36// 100回繰り返す 37func repeatProcess() { 38 39 for _ in 1...100 { 40 print(piyo()) 41 } 42 43} 44 45// 計測 46 47let start = Date() 48 49repeatProcess() 50 51let elapsed = Date().timeIntervalSince(start) 52 53print(elapsed) 54
MasakiHori👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

いわゆる高階関数を使う場合はこうなります。

swift

1selectedRowsIndexPaths.contains(where: indexPaths.contains)

↓こっちの方が遅い

swift

1let result = !selectedRowsIndexPaths.filter(indexPaths.contains).isEmpty

投稿2020/05/07 02:53

編集2020/05/07 03:05
MasakiHori

総合スコア3391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasakiHori

2020/05/07 03:05

平均処理速度がより速い方法を思いついたので修正しました
退会済みユーザー

退会済みユーザー

2020/05/07 04:30

回答ありがとうございます。 スッキリ書けていいです。 10回試して平均とかを撮ったわけではないですが、簡単な計測をしたところ Setに変換したやつのパフォーマンスが思っていたより悪くないのはちょっとびっくりしました。
MasakiHori

2020/05/07 05:51

Setはビックリするぐらい速いことがありますね 両方のArrayをSetにしてintersection().isEmptyで判定でしょうか? こうやったらいい感じだったよという情報があれば、のちの方達のためになりますので暇があれば質問に書き加えておいてください。
退会済みユーザー

退会済みユーザー

2020/05/07 05:57 編集

両方のArrayをSetにして!(a.isDisjoint(with: b))で共通要素がないかをやってみたのですが、Setへの変換コストとか関係ないのかな? すごく適当に測ってみたのですが、結果に驚いたので念の為、質問に追記しておきました。
guest

0

やりたいことに対して今の方法よりもっといい方法がある気がしますが、
一応書いてみるとこんな感じですかね

indexPaths.foreach{ if selectedRowsIndexPaths.contains($0) { return true } } return false

投稿2020/05/06 01:32

popai306

総合スコア157

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/06 01:59

回答ありがとうございます。エラーがでます。=> 質問に追記 どこを直したら良いでしょうか?
popai306

2020/05/06 02:31

for in 文にしたほうがいいかもですね ``` for indexPath in indexPaths { if selectedRowsIndexPaths.contains(indexPath) { return true } } ```
退会済みユーザー

退会済みユーザー

2020/05/06 02:37

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問