Java.use(better);

前の記事次の記事
Java.use(better);


Episode#05

Map の効能 -- 配列と別れる50の方法


《関連記事》

連想配列への応用

ソースコードに含まれる予約語の度数分布表を作成する事例で話を進めます。

 ̄クラスライブラリーの中から、この問題解決に必要なのは、インターフェース java.util.Map に準拠するクラス群です。そこでは「連想配列」を扱うのに必要なプロトコルが規定されています。その恩恵に浴する前に、連想配列を実現する手法を紹介して、2つの配列を扱うときの問題点を探ります。

実行すると、次の結果が得られ、

components-TreeDemoProject/src/components/TreeDemo.java
  abstract: 0
     catch: 2
      char: 0
     class: 2
     final: 0
       for: 4
        if: 11
            ...
      void: 7
     while: 0
         @: 851
[930]

if 文が登場するのは 11 回だと分ります。これまでに紹介した手法を実践すると、その前後で if/for などの数が減少したのを確認できます。

写像〔= mapping〕は、要素対(キーと値)で構成されます。そこで、度数分布表を作成するのに必要な、連想配列を実現するのに、

  • 文字列(予約語)を列挙した、キー配列 String[] reservations
  • 整数値(度数)を列挙した、値配列 int[] values


の2つの配列を用意しました。そこで、

abstract class Histogram {
  protected final String[] reservations = {
    "abstract",
    "catch",
    "char",
    ...
    "@"
  };

キー配列 reservations には、初期値に予約語を設定して、

// Java -- 連想配列
class Histogram1 extends Histogram ...
  int[] values = new int[reservations.length];

値配列 values には、初期値に度数 0 を設定します。

ある予約語の度数を得るには、

  int value(String key) { return values[index(key)]; }

メソッド value を利用して、予約語をキー key に指定すると、その度数が得られます。しかし、その前に

  private int index(String key) {
    int index = 0;
    for (String s: reservations) {
      if (key.equals(s)) return index;
      index++;
    }
    return index-1;
  }

補助メソッド index を介して得られる、予約語 key を含む配列のオフセット値が必要です。

 ̄しかし、このように複数の配列を扱っていると、コードが複雑で見通しも悪くなるだけでなく、バグの温床になりがちです。

 ↑ TOP

》作業中です《

update*13/01/23 2:23:44