19.0407
Map
Map も、コレクション/Collections という、カテゴリー/分類 になります。
つまり、List、Set の、仲間 です。
もちろん、List と、Set が違うように、
Map もまた、独自の特徴を持っています。
Map は、辞書 に、よくたとえられますが、
一問一答 形式 の、単語帳 の方が、より近いでしょう。
リンゴ:apple
みかん:orange
車:car
コンピュータ:computer
鳥:bird
こんな感じです。
また、Map は、Set と同様に、検索が早いようです。
1. Mapインスタンス 作成
Map も、List や Set 同様に、
MutableMap が、あります。
List、Set が、読み取り専用である/追加・削除ができない ように、
Map も、読み取り専用 です。
同様に、MutableMap では、追加・削除 が、出来ます。
Mapインスタンス、MutableMapインスタンス も、List/Set と、ほぼ同じ形式で、
作成できます。
ここで、確認しておきますが、
インスタンス/instance
は、以前少し触れたと思いますが、簡単に、おさらいしましょう。
「19. class ⇒ instance」 で、扱いますが、
class が、設計図 で、インスタンス が、設計図から作られたもの
ということなのです。
Java は、今でも、人気ですが、Javaでは、あるクラスから作られたものを、
オブジェクト
と、言っていましたが、
Kotlin では、インスタンス/実物/実例(設計図に対して)と、言った方が、
いいと思います。
なぜなら、Kotlin では、たとえ、
1
であっても、
1.toString()
のように、まるで、オブジェクトであるかのように、
振舞えるのです。
もとい、オブジェクトなのです。
ただ、Java の分かる人への説明では、
1 が、メソッドを使うときだけ、
int ではなく、
Integer へと、変身する
ようなものと言えば、分かりやすいと思います。
Java とは何ですか?という人もたくさんいると思いますが、
1 は、ただの 数値 の、1 なのに、
例えば、1.toString() // 文字列に変換する
と、コードで書かれると、あたかも、オブジェクトである振りをする。
みたいな感じだと思えばいいと思います。
となると、class型の、オブジェクト と、
オブジェクトもどき(失礼な言い方?)
の区別が、あいまいになる気がします。
いろいろな勘違いも出やすい気がします。
だから、classのオブジェクトの場合は、
インスタンス/instance
と言った方がいいのではないかと、思います。
ということで、私は、
class型のオブジェクトに関しては、
インスタンス という言葉を使っていきます。
ちなみに、
数値
と言った時、日本語の場合、
文脈によって、違ってきます。
Int や Double のことを指すのか、
値型/value type のことを指すのか、ということです。
これには、気を付けましょう。
英語の場合、Int などは、numbers と言いますので、
どちらのことかということでの、勘違いはないと思われますが。
また、primitive type / プリミティブ型 と言うのは、
value type のことです。
少し脱線しましたが、
Mapインスタンス、MutableMapインスタンス も、
List/Set グループ と、作成方法が、似ている
というところからでした。
ただ、2つで、1組の対 に、なりますので、
それを、< > を、使って、表す部分での、方法が、
少し違います。
Mapインスタンス、作成の構文
val 変数: Map<キー, 値> = mapOf(キー1 to 値a, キー2 to 値b, キー100 to 値y)
こんな感じですが、コード を、照らし合わせてみれば、分かりやすいと思います。
同様に、MutableMapインスタンス も、作成できます。
mutableMapOf(キー&要素s)関数 を、使えば、OKです。
2. あるキー に対する、特定の値 を、読み取る
Mapの全体像は、println(Mapインスタンス) で、
表示できるのは、先ほどのコード で、確認できました。
今度は、どれかあるキー に、対する/関連付けられている 特定の値 を、表示してみましょう。
それには、MutableMap/Map インスタンス を使って、こんな風に書きます。
Mapインスタンス(MutableMapインスタンス)[キー]
で、OKです。
今度は、MutableMapインスタンス を、使ってみましょう。
文字列テンプレート/${ } の中の、
mainCity["岐阜県"]
というコードで、
キーである、"岐阜県"
を使って、
値である、"岐阜市"
を、表示しました。
3. MutableMapインスタンス は、追加・削除 が出来ます
先にも、言いましたが、MutableMapインスタンス なら、
追加・削除
が、出来ます。
それでは、試してみましょう。
まずは、
coolAnimals
という、MutableMapインスタンス を、作りました。
追加するには、2通りの方法があります。
一つ目の方法は、こんなコードで、追加します。
MutableMapインスタンス.put(キー, 値)
もう一つの方法は、最初の方法で書いたら、IntelliJ君が、少し不満そうだったので、
リファレンスで調べました。(エラーではないが、もう一つの方法を提案してきた)
もしかしたら、こちらの方法の方が、ポピュラーかもしれないので、一応書いておきます。
上の方法の方が、簡単な気がしますが、こちらの方が、「キー」 が、強調されます。
MutableMapインスタンス[キー] = 値
実際のコードを見て確認してみましょう。
今度は、削除してみましょう。
こんなコードを書きます。
MutableMapインスタンス.remove(キー)
実際のコードは、こうなります。
4. null/何もない 時の対応
先ほどのコードで、すでに、削除されている 「キー:さる」 で、
値 を読もうとしたら、どうなるでしょうか?
とりあえず、やって見ましょう。
結果は、
null(何も無い、という意味、の、キーワード)
が、返されました。
でも、これが、Androidアプリ だとしたら、なんとも不親切ですね。
場合によっては、「null」 なんぞという言葉は、登録した覚えがないぞ、、
どうなってんねん? などと思われて、★一つ に、なるかもしれません。
そんな時には、例えば、
その言葉は登録されていません
などと、分かりやすい言葉で返したいでしょう。
その対応策として、
getOrDefault()関数
というものがあります。
つまり、ゲット/表示する or デフォルトに登録したあるメッセージで返す、、
という意味です。
この関数の、引数/()に入れるべき も、含めてのコードは、
Map/MutableMap_インスタンス.getOrDefault(キー, "メッセージ")
です。
ここでは、キー を、さる と、きつねで、やって見ましょう。
キー:"さる" は、Map の中に無いので、
その単語は、登録されていません
と、返してくれました。
また、キー:"きつね"は、ありますので、
fox
と、返してくれました。
まとめ
・List、Set、Map の違いを、自分でまとめてみましょう。
(私も、このシリーズが、終わったら、トライします。)
・Mapとは、一問一答 形式 の、単語帳 と、言える。
・Mapデータは、キー:値 の、ペアで存在する。
・Mapデータ を、検索する時は、キーを、使う。
・検索方法は、Mapインスタンス(MutableMapインスタンス)[キー] である。
・MutableMapインスタンス に、データを追加する、2つの方法:
MutableMapインスタンス.put(キー, 値)
MutableMapインスタンス[キー] = 値
・MutableMapインスタンス から、データを削除する時のコード:
MutableMapインスタンス.remove(キー)
・データを検索した時、何もなければ、null を、返す。
・データを検索して、ある時は、表示して、ない時は、"メッセージ" を、返すには、
Map/MutableMap_インスタンス.getOrDefault(キー, "メッセージ")
を使いましょう。