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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

873閲覧

2重配列の配列の部分集合判定

lyzmfeqpxs54

総合スコア237

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/01 12:31

Swiftのコーディングに関する質問です。
配列の部分集合の判定はisSubsetOfを使用すればできますが、2重配列の部分集合を判定するにはどのようにすれば良いのでしょうか。下記コードのx、yを判定したいのです。

よろしくお願いいたします。

Swift

1var a:[String] = ["a", "b", "c", "d", "e", "f"] 2var b:[String] = ["a", "b", "e"] 3var c:[String] = ["e", "g"] 4 5var flag1 = Set(b).isSubsetOf(Set(a)) //true 6var flag2 = Set(c).isSubsetOf(Set(a)) //false 7 8 9var x:[[String]] = [["a", "b"], ["c", "d"], ["e", "f"], ["g", "h"], ["i", "j"]] 10var y:[[String]] = [["a", "b"], ["c", "d"], ["e", "f"]] 11 12var flag3 = Set(y).isSubsetOf(Set(x)) //エラー表示 trueを返したい 13

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

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

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

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

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

guest

回答1

0

ベストアンサー

var z = Set(x)の初期化ができないので難しいですね。
xSetに渡せるように適合させることもできるかなぁと思いましたが、自分では分かりませんでした、、、

やりたいことを実現する一つの案として以下を参考にしてみてください。

swift

1var x:[[String]] = [["a", "b"], ["c", "d"], ["e", "f"], ["g", "h"], ["i", "j"], ["i", "aj"]] 2var y:[[String]] = [["a", "b"], ["c", "d"], ["e", "f"]] 3 4 5// resultFlgには「y」の要素が全て「x」に含まれている場合は'true', 含まれていない場合は'false'が入る 6 7// (true)は初期値, forwardFlgは前のBool値が入ってくる(最初は初期値'true') 8// elementYは「y」の要素が毎回入ってくる 1: ["a", "b"], 2: ["c", "d"], 3: ["e", "f"] 9 10let resultFlg = y.reduce(true) { (forwardFlg, elementY) -> Bool in 11 12 // 前のフラグが'false'だった場合は、含まれていない値があったので'false'を返す 13 if !forwardFlg { 14 return false 15 } 16 17 // xの配列の要素を一つづつ取り出す 18 for elementX in x { 19 if elementY == elementX { 20 // elementYが「x」に含まれていたので'true'を返す(次のforwardFlgは'true'になる) 21 return true 22 } 23 } 24 25 // 今回のelementYは「x」に含まれていなかったので'false'を返す(次のforwardFlgは'false'になる) 26 return false 27} 28 29resultFlg 30//=> true

投稿2016/07/01 16:17

編集2016/07/04 13:06
_Kentarou

総合スコア8490

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

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

lyzmfeqpxs54

2016/07/04 02:57

返信遅くなり申し訳ございません。無事解決いたしました。いつも迅速な対応ありがとうございます。 コードは自分なりに読み解けたのですが、もしよろしければ動作の簡単なコメントをつけていただけないでしょうか。お時間あればで構いません。 よろしくお願いいたします。
_Kentarou

2016/07/04 13:07

回答にコメントを追記しました、変数名が分かりにくい箇所もあったので合わせて修正しています。
lyzmfeqpxs54

2016/07/08 04:11

いつもご回答ありがとうございます。ご丁寧な解説でしっかりと理解することができました。また、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問