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

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

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

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

Q&A

解決済

2回答

4819閲覧

2次元配列全体に値が存在するか確認するよい方法を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/07/26 06:34

編集2018/07/27 01:18

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

2次元配列に値が存在するか確認する方法を知りたいです。

いままでは、append先の配列に重複した文字列が無いかだけを確認して下記のようにしていたのですが、配列全体で重複した文字列を追加したくない場面はどのようにすればいいでしょうか?
自分では、for-in文ですべての要素を取り出してcontainsで判定するくらいしか思いつかないので簡潔で良い方法があれば教えてください。

swift

1 2// 配列定義 3var arrayOfArray = [["AAA", "BBB", "CCC"],["DDD","EEE","FFF"]] 4 5var addStr: String = "HHH" 6 7// append先の配列に同一の値が存在するか確認して書き込み 8 9if arrayOfArray[0].contains(addStr) == false { 10 arrayOfArray[0].append(addStr) 11} 12 13// ↑のような感じで対象を、配列全体に対して同一の値が存在するか確認してから書き込みしたい。

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

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

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

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

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

fuzzball

2018/07/26 06:45

質問のコードでは配列全体をチェックしていない([0]しかチェックしていない)のですが、[0]に追加するときは[0]だけのチェックでいいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/26 06:49

同じような感じで配列全体に対してチェックをする簡潔な方法を知りたいです。
guest

回答2

0

fuzzballさんの回答の補足ですがそのままif文で使う場合

swift

1if arrayOfArray.flatMap({$0}).contains(addStr) { 2 print("hogehoge") 3}

のように括弧が必要になります。実際は別の変数や定数に入れた方が見透しが良いと思うのであくまでも補足なのですけども。

投稿2018/07/26 07:46

xAxis

総合スコア1349

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

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

fuzzball

2018/07/26 08:06

なんと! { がif文の { と認識されてるんですかね。個人的には、 if (arrayOfArray.flatMap {$0}.contains(addStr)) { こっちの方が好みです。
退会済みユーザー

退会済みユーザー

2018/07/27 01:13

回答有り難うございます。 これは、教えてもらわなかれば自分ではif文でかけなかった…。
xAxis

2018/07/27 02:41

>>fuzzballさん おー!自分は逆に if (arrayOfArray.flatMap {$0}.contains(addStr)) {} が通るのを知りませんでした。勉強になります!自分の書き方よりも丸々括弧で括った方が見通し良いですね。しかし この括弧の疑問未だに謎なのです。fuzzballさんの推測通りなのかもしれません。 >>tyobigorou いえいえ、もしコードを書かれる時にお役に立てれば嬉しいです。
guest

0

ベストアンサー

flatMap

flatMapで一次元配列にしてからcontains。

swift

1var arrayOfArray = [["AAA", "BBB", "CCC"], ["DDD", "EEE", "FFF"]] 2print(arrayOfArray.flatMap {$0}) //=> ["AAA", "BBB", "CCC", "DDD", "EEE", "FFF"] 3print(arrayOfArray.flatMap {$0}.contains("EEE")) //=> true 4print(arrayOfArray.flatMap {$0}.contains("HHH")) //=> false

first

普通にループ回してる感じ。
nilなら含まれていない。

swift

1print(arrayOfArray.first {$0.contains("EEE")}) //=> Optional(["DDD", "EEE", "FFF"]) 2print(arrayOfArray.first {$0.contains("HHH")}) //=> nil

投稿2018/07/26 06:36

編集2018/07/26 08:19
fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2018/07/26 06:38 編集

ありがとうございます。集合っすね。調べてやってみます。
fuzzball

2018/07/26 06:41

あぁ失礼。「配列全体で」を見落としてました。
fuzzball

2018/07/26 07:00 編集

修正しました。(やってることはベタチェックですが)
退会済みユーザー

退会済みユーザー

2018/07/27 01:29 編集

Boolを返すことだけ考えていて、firstの方のように配列を返す考えはありませんでした。 arrayOfArray.filter{$0.contains("eee")}で、[]か判定しておいて、[]でない場合、返ってくる配列を場所特定などに使うとかも良さげに思えます。 いろいろ教えていただいてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問