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(キー, "メッセージ")
 を使いましょう。