Processingで学ぶ 実践的プログラミング専門課程

第9回 配列とコレクション

この記事を読むのに必要な時間:およそ 4.5 分

導入

今回から「データ構造とアルゴリズム」という大きなテーマの中から,次の4つのトピックをとりあげます。

  • 配列とコレクション
  • サーチ
  • ソート
  • 再帰

現在主流となっているほとんどの高級言語やデータベースはこれらの仕組みをあまり意識しないで利用できるようになりました。むしろ下手に自作することは「車輪の再発明」と揶揄されてしまうぐらいです。

しかしながら,ソフトウェア開発の規模が大きくなるにつれ,用意された道具では足りない状況が生じてきます。そうなると車輪をカスタマイズすることになるでしょう。あるいは用意された道具の働きや速度に疑問がある場合,検証する知識が必要です。これらの内容はソフトウェアを専門とする学生が必ずクリアすべき関門です。

今回はその第1回目として「配列とコレクション」について説明します。

展開

配列からコレクションへ

どのプログラミング言語を学習する人も,複数の変数を調子よく取り扱うための仕組みとして配列を学習します。その後クラスやオブジェクトについて学び,便利なクラスの例としてArrayListHashMapといったコレクションのクラスを学習するでしょう。配列とArrayListを比較すると,初学者の方には違いやメリット,使い分けの意図が分かりにくいものです。ここでは,その点に注目しながら説明します。

配列

配列(はいれつ)は同じ型の変数を複数取り扱うために考案された仕組みです。配列は変数名にカッコ付きの整数を添えることで順番を決め,要素を区別します。配列によってまとめられた,一つひとつの変数を要素(ようそ)と呼びます。要素を区別するために添えた数字を添字(そえじ)と呼びます。

配列は大変シンプルで,コレクションクラスに比較すると必要とするメモリ量が少なく,アクセスが高速なことがメリットです。データを単純に格納して,順番に参照する程度の用途であれば,コレクションクラスに比較して配列のほうが有利です。

最も基本的な配列の使用例を次に示します。配列の要素数を含めて宣言し,配列の添字を明記して要素に値を代入し,添字を指定して要素の値を呼び出します。

FundamentalFor1.pde。配列要素の設定と基本的なfor文を使った要素の列挙

String[] names = new String[4];

names[0]= "Tim Bray";
names[1] = "Brian Kernighan";
names[2] = "Jon Bentley";
names[3] = "Karl Fogel";

for(int i = 0; i < names.length; ++i){
  println(names[i]);
}

上のコードは配列要素の設定に何度もnames[*] =を入力します。これが基本であることを確認した上で、無駄な入力を省くために次のような要素の値の代入方法が用意されています。

FundamentalFor2.pde。より簡易な配列要素の設定

String names[] = {"Tim Bray",        // 0番目の要素
                  "Brian Kernighan", // 1番目の要素
                  "Jon Bentley",     // 2番目の要素
                  "Karl Fogel"};     // 3番目の要素

for(int i = 0; i < names.length; ++i){
  println(names[i]);
}

さらに,添字を指定して要素にアクセスする必要がない場合のために,拡張for文があります。拡張for文を使うことで,添字を指定するためのカウンタ変数を使用せずにシンプルに列挙できます。つまり,上のコードは次のFundamentalFor2.pdeのように書けます。

ExtendedFor.pde。拡張for文を使った配列要素の列挙

String names[] = {"Tim Bray",
                  "Brian Kernighan",
                  "Jon Bentley",
                  "Karl Fogel"};

for(String name : names){
  println(name);
}
配列のソートとサーチ

一つの名前でたくさんの値を取り扱うことができる配列は大変便利な仕組みです。しかし,配列に代入した値を特定の順番に並べ替える「ソート」や,目的の値の位置を探す「サーチ」などの仕事をするために,プログラマはコードを書かなければなりません。もちろん,配列を使わない場合に比べればずいぶん楽な仕事なのですが,それでも新しいコードを書くということは,バグを作成する可能性を生んでしまうのですから,なるべく避けたいところです。

毎度必要になるのが分かっている仕事をプログラマがその度に用意するのは効率がよくありません。そこで,これらの仕事をしてくれるメソッドをまとめたユーティリティクラスであるArraysが用意されています。Arraysクラスを用いると,およそ配列に必要な基本的な操作が,新たにコードを組むことなくメソッドを呼び出すだけで実行できます。

ArraysSortAndSearch.pde。配列とそのユーティリティクラスの使用例

import java.util.Arrays;

String names[] = {"Tim Bray",
                  "Brian Kernighan",
                  "Jon Bentley",
                  "Karl Fogel"};

println("toString > " + Arrays.toString(names));
Arrays.sort(names);
println("* Sorted");
println("toString > " + Arrays.toString(names));
println("* Search");
println("Position of 'Jon Bentley' is " + 
        Arrays.binarySearch(names,"Jon Bentley") );

ソートやサーチについては次回以降で詳しく学習します。今回の演習では最も基本的なソートとサーチのコードを書く演習を示します。予習として取り組んでください。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。やがては結城浩氏のような仕事をしたいと妄想している。

Twitter : @hirata_atsushi

コメント

コメントの記入