今回は、Dartのリストについて紹介します。
Dartには配列は用意されていないので、リストを配列として使います。内部的には、配列による実装と、連結リストによる実装があり、どのように初期化するかによって、どちらの実装が使われるかはかわります。DartプログラムをJavaScriptプログラムへコンパイルすると、リストは配列になります。
宣言は次のようになります。ここでは、1, 2, 3 という要素を持つ配列となります。(ちなみに、型を指定したい場合は、var の変わりに、List
var list0 = [1,2,3]; List<int> list1 = [1,2,3];
配列の要素数を知るためには、lengthを使います。また、i番目の要素へアクセスするには、list0[i]のように指定をします。これらを組み合わせると、次のようにすべての要素を表示するプログラムを書くことができます。
void main() {
  var list = [1,2,3];
  print(list.length)
  for (int i=0 ; i<list.length ; i++) {
    print("$i:${list[i]}");
  }
}
配列へ要素を追加するために、addメソッドが用意されています。また要素を削除するために、removeRangeメソッドが用意されています。次の例では、リストへ4という値を要素として追加してから、2番目(pos=2)の要素から1つの範囲(length=1)で要素を削除しています。
void main() {
  var list = [1,2,3];
  list.add(4);
  print(list);
  int pos = 2;
  int length = 1;
  list.removeRange(pos, length);
  printList(list);
}
void printList(var list) {
  for (int i=0 ; i<list.length ; i++) {
    print("$i:${list[i]}");
  }
}
ここまでは、for文を使って、リストの各要素へアクセスしました。Dartではリストの各要素へのアクセス方法として for, for…in, forEachメソッド の3つの方法が提供されています。残りの例について見てみましょう。
「リストの何番目の要素か」という情報が必要なければ、次のように for…in を使えます。
void main() {
  var list = [1,2,3,4];
  for (final e in list) {
    print(e);
  }
}
forEachメソッドを使って、各要素へ適用する処理を渡すこともできます。このメソッドの中では、引数に渡された処理を各要素に対してコールバックしてくれます。
void main() {
  var list = [1,2,3,4];
  void printElement(e) => print(e);
  list.forEach(printElement);
}
関数に名前をつけずに直接指定することも可能です。
void main() {
  var list = [1,2,3,4];
  list.forEach((e) => print(e));
}
2次元配列を表現したい場合は、次のようになります。Listオブジェクトを作成するときに、サイズを指定すると固定長のリストが用意されるので、addメソッドで要素を追加するより、代入で追加したい場合は、list2daのようにしましょう。
void main() {
  var size = 10;
  List<List<int>> list2d = new List<List<int>>();
  for (int j=0 ; j<size ; j++) {
    list2d.add(new List<int>());
    for (int i=0 ; i<size ; i++) {
      list2d[j].add(i*10 + j);
    }
  }
  print("list2d ----");
  printList(list2d);
  List<List<int>> list2da = new List<List<int>>(size);
  for (int j=0 ; j<list2da.length ; j++) {
    list2da[j] = new List<int>(size);
    for (int i=0 ; i<list2da.length ; i++) {
      list2da[j][i] = i*10 + j;
    }
  }
  print("list2da ----");
  printList(list2da);
}
void printList(List<List<int>> list2d) {
  for (int j=0 ; j<list2d.length ; j++) {
    for (int i=0 ; i<list2d[j].length ; i++) {
      print("$i, $j : ${list2d[j][i]}");
    }
  }
}
- クラスベースのオブジェクト指向プログラミング言語の基礎を学ぶには … 改訂版 基礎Java(CD-ROM付) (IMPRESS KISO SERIES)
 - クラスベースのオブジェクト指向プログラミング言語を学ぶには … プログラミング言語Java (The Java Series)
 - 関数型プログラミング言語を学ぶには … Scalaスケーラブルプログラミング第2版
 - プログラミング言語の理論を学ぶには … プログラミング言語の基礎概念 (ライブラリ情報学コア・テキスト)