【ITコラム】プログラム入門:配列とMAP

みなさんこんにちは!
飲み会の翌朝の体重に戦々恐々としているIT事業本部のてらにしです。(注; 執筆時は3月半ばです)。
リモートワークになり、マンションから一歩も出ない日もあってとても不健康な感じがしなくもないですが、満員電車に乗らなくて済むのでストレスフリーで過ごしています。

さて、入門シリーズ第三回は「配列とMAP」です。
今回は配列とMAPということで、型の話題に戻ります。
配列やMAPとは何か、というと複数の値(のアドレス)を持てる型となります。

使える型は言語ごとに違いますが、配列(Array)、List、Collection、Mapというような名前が付くものを指しています。

配列とは

配列とは

まず、配列(Array)についてですが、複数の値が持てるもの、と覚えていただければ今はそれで十分です。
配列を使わないでも変数を大量に書き連ねれば同じようなことが出来ますが、衣装棚、化粧箱、本棚・・のように同じ種類のものがまとまっている方がすっきりしますよね。
むしろ素のまま放り出していたり、お皿と服を一緒に片付けたり・・という方はほとんど居ないのではないかと思います。(居たらごめんなさい)

使い方としては、下記のような書き方で宣言するものが多いです。

    String fruits[] = {“りんご”, “みかん”, “めろん”};

そして値の取り出し方は、下記のようになります。
※ スラッシュを二つ並べて書くのは、その後は全部コメントでプログラムとしては動作しませんよーという意味です。

    String ringo = fruits[0]; //配列 fruitsの最初の要素を取得
    String mikan = fruits[1]; //配列 fruitsの2番目の要素を取得
    String meron = fruits[2]; //配列 fruitsの3番目の要素を取得

逆に値を設定する時は下記のようになります。

    fruits[0] = “apple”;  // 配列fruitsの最初の要素にappleを設定
    fruits[1] = “orange”; // 配列fruitsの2番目の要素にorangeを設定
    fruits[2] = “melon”; // 配列fruitsの3番目の要素にmelonを設定

ここで気になるところとしては、

  1. 配列の変数名の後ろについている括弧って何?
  2. 括弧の中身の数字は?1番目だから1じゃないの?

あたりかな、と思います。

まず括弧が何かというところについてですが、配列を宣言する場合、複数の値が入りますよーという意味で[]を付けます。
例によって言語やコーディング規約(プログラムを書く上でのお作法的なもの)によって違いますが、今回は変数名の後ろに[]を付けてますが型の後ろにつく場合もあります。

    String[] fruits = {“りんご”, “みかん”, “めろん”};
    //String fruits[] = {“りんご”, “みかん”, “めろん”};  //上の行と同じ意味

初期化(最初に変数を用意する)のタイミングで値を入れず、入れ物の変数だけ用意することも出来ます。また、入れ物を用意する際には、いくつ分の入れ物を用意するかを括弧内に数字を指定することで指定出来ます。

メリットとしては、不要なメモリを使ってしまうことを防ぐことが出来たり、その後の処理で入ると想定している数を明記することでバグを防いだりも出来ます。

String[] str = new String[3];//3個だけ要素を入れられる

続いて、括弧の中身の数字は?についてですが、取り出す(もしくは設定する)内容が入っている場所を指しています。何故0からなの?に関してはそういうもの、と割り切ってしまった方が良いかと思います。
言語によっては、1からの方が分かりやすいとして1始まりになっていることもありますが、少数派であり、逆に0からに親しんでいるプログラマには気持ち悪いと敬遠されたりもします。

ListとMap

以降については、今後の記事で触れていく内容も含んでいますので、急にプログラム感がマシマシになりますが、身構えなくても大丈夫です。そんなのがあるんだなという程度で流して下さい。

List

List

List(Collection)についてですが、こちらは配列をもっと便利にしたものくらいの認識でも大丈夫です。値の格納、取り出し、変換、カウント等をする為のメソッド(関数)が用意されており、配列に比べて色々と便利なので、よく使います。むしろ、素の配列で扱うことは少ないかもしれません。(古いソースやそもそもListが用意されていなかったりする言語では配列を使っていますが)

具体的に何が出来るか、というのは言語やバージョンによって違いますので、それぞれの公式のドキュメントを参照してみて下さい。
例:Java 8(https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html)

上でメソッド(関数)という単語が出てきましたが、これは特定の処理をまとめて名前をつけたものです。

メソッド(関数)には引数というものを設定でき、処理に必要な指定した値を受け取ることが出来るようになります。また、戻り値という処理結果を返すことが出来ます。
例えば、「お会計」 というメソッドを作ります。引数は買い物カゴとし、戻り値は買い物カゴをそのまま返すこととします。
お会計 が呼ばれると以下の処理をします。

  1. 引数として渡された買い物カゴの中身を全て取り出す
  2. 1.で取り出した中身の金額を全て合計する
  3. お客様から代金を受け取る
  4. 3.で受け取った金額と2.で計算した金額を確認する
  5. 4.で確認した結果、お釣りがあればお釣りを渡し、足りなければ請求する
  6. 商品を受け渡す(買い物カゴを返す)

このように定義することで、毎回1〜6の内容を記載しなくても、お会計(買い物カゴ) という呼び出しをするだけで、同じ処理を行ってくれます。

Map

Map

最後にMapについてですが、配列とは違い、何番目の値を取り出す、何番目の値に設定する、という使い方ではなくキーというものを持ち、そのキーに該当する値を取得する、という使い方となります。
なお、連想配列と呼ばれるものも配列とはついていますが、Map同様の使い方です。

例えば、フルーツの名前をキー、フルーツの金額を値としてMapに格納すると、メロン というキーが渡ってきた時に、メロン に該当する金額を返してくれる という形になります。

下記はJavaでの例です。
前提:メソッド(関数)の使い方:変数の後ろにドット(.)を書いて、その後にメソッド名と括弧を書きます。
Mapにあるメソッドの説明:
put(key, value)  key(キー)に紐づくValue(値)を入れる
get(key)  key(キー)に紐づく値を取得する

    // fruitsという名前のMapで、キーはString型、ValueはIntegerが格納されます。
    Map<String, Integer> fruits = new HashMap<String, Integer>();
    fruits.put(“メロン”, 1000);
    fruits.put(“イチゴ”, 500);
    fruits.put(“マンゴー”, 300);
    
    Integer price = fruits.get(“メロン”); // 1000を返す。

まとめ

型の話と言いながら色々違うこと書きすぎでしょうというツッコミが聞こえなくもないですが、これで入門シリーズ3回目の「配列とMAP」については終わります。次回は「ループ文」ということで繰り返し処理について取り扱う予定です。

なお、冒頭にある「複数の値(のアドレス)」の括弧内にある「のアドレス」が何を言っているのかや、途中で話題に出しているメソッドについては改めて触れていきますので、興味がある方は引き続き入門シリーズにお付き合い下さいませ。
それでは、この辺で。

てらにし
スノボと猫と日本酒をこよなく愛するエンジニア
オススメのお酒は三和酒造の臥龍梅 山田錦と、吉田酒造の手取川 名流